Spring 启动忽略@JsonDeserialize 和@JsonSerialize
Spring Boot ignores @JsonDeserialize and @JsonSerialize
我有一个带有 RESTful 端点的 Spring 启动应用程序,我想为 joda-time 添加自定义序列化程序,但我无法让应用程序默认 Jackson serailzier 识别我的定制款。
我使用 @RepositoryRestResource
创建了 RESTFul 个端点
@RepositoryRestResource(collectionResourceRel = "x", path = "x")
public interface XRepository extends PagingAndSortingRepository<X, Long>
{
}
然后我对 return 所有对象 X 进行 GET 调用:
这是我的序列化程序:
@Component
public class JsonDateSerializer extends JsonSerializer<DateTime>
{
private static DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
@Override
public void serialize(DateTime value, JsonGenerator gen,
SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
}
}
然后我将其添加到 属性 Getter 中,如下所示:
@JsonSerialize(using=JsonDateSerializer.class)
public DateTime getDateCreated()
{
return dateCreated;
}
这个序列化程序在普通应用程序中工作得很好,但是当我尝试在我的 Spring 引导应用程序中使用它时,这些序列化程序被忽略了。
如何让 Spring 启动以识别这些序列化程序?
好吧,经过一番折腾,我找到了答案。我在 joda-datetime 的序列化和反序列化中使用了错误的库。
我正在使用
org.codehaus.jackson
我应该在什么时候使用
com.fasterxml.jackson
我想这是一个容易犯的错误,因为两个库具有几乎相同的属性和方法,因为 com.fasterxml.jackson 是建立在 org.codehaus.jackson 之上的。
现在回头看是个愚蠢的错误,但学到了宝贵的教训,始终检查您是否使用了正确的库!!!!
使用 Spring MVC 4.2。1.RELEASE,您需要使用如下新的 Jackson2 依赖项才能使反序列化器工作。
不要使用这个
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
改用这个。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.2</version>
</dependency>
也使用 com.fasterxml.jackson.databind.JsonDeserializer 和 com.fasterxml.jackson.databind.annotation.JsonDeserialize 进行反序列化,而不是 org.codehaus.jackson
中的 类
我有一个带有 RESTful 端点的 Spring 启动应用程序,我想为 joda-time 添加自定义序列化程序,但我无法让应用程序默认 Jackson serailzier 识别我的定制款。
我使用 @RepositoryRestResource
创建了 RESTFul 个端点@RepositoryRestResource(collectionResourceRel = "x", path = "x")
public interface XRepository extends PagingAndSortingRepository<X, Long>
{
}
然后我对 return 所有对象 X 进行 GET 调用:
这是我的序列化程序:
@Component
public class JsonDateSerializer extends JsonSerializer<DateTime>
{
private static DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
@Override
public void serialize(DateTime value, JsonGenerator gen,
SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
}
}
然后我将其添加到 属性 Getter 中,如下所示:
@JsonSerialize(using=JsonDateSerializer.class)
public DateTime getDateCreated()
{
return dateCreated;
}
这个序列化程序在普通应用程序中工作得很好,但是当我尝试在我的 Spring 引导应用程序中使用它时,这些序列化程序被忽略了。
如何让 Spring 启动以识别这些序列化程序?
好吧,经过一番折腾,我找到了答案。我在 joda-datetime 的序列化和反序列化中使用了错误的库。
我正在使用
org.codehaus.jackson
我应该在什么时候使用
com.fasterxml.jackson
我想这是一个容易犯的错误,因为两个库具有几乎相同的属性和方法,因为 com.fasterxml.jackson 是建立在 org.codehaus.jackson 之上的。
现在回头看是个愚蠢的错误,但学到了宝贵的教训,始终检查您是否使用了正确的库!!!!
使用 Spring MVC 4.2。1.RELEASE,您需要使用如下新的 Jackson2 依赖项才能使反序列化器工作。
不要使用这个
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
改用这个。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.2</version>
</dependency>
也使用 com.fasterxml.jackson.databind.JsonDeserializer 和 com.fasterxml.jackson.databind.annotation.JsonDeserialize 进行反序列化,而不是 org.codehaus.jackson
中的 类