Spring Boot忽略@JsonDeserialize和@JsonSerialize

时间:2015-05-21 14:27:41

标签: java spring-mvc serialization spring-boot jodatime

我有一个带有RESTful端点的Spring Boot应用程序,我想为joda-time添加自定义序列化程序,但我无法让应用程序默认使用Jackson serailzier来识别我的自定义端口。

我使用@RepositoryRestResource

创建了RESTFul端点
@RepositoryRestResource(collectionResourceRel = "x", path = "x") 
public interface XRepository extends PagingAndSortingRepository<X, Long>
{
}

然后我有一个GET调用来返回所有对象X:

  

http://localhost:8181/x

这是我的序列化器:

@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 Boot应用程序中使用它时,这些序列化程序会被忽略。

如何让Spring Boot识别这些序列化程序?

2 个答案:

答案 0 :(得分:5)

好的,经过多次煎熬,我找到了答案。我使用错误的库来进行joda-datetime的序列化和反序列化。

我正在使用

  

org.codehaus.jackson

我本来应该使用

  

com.fasterxml.jackson

我想这是一个容易犯的错误,因为两个库都有几乎相同的属性和方法,因为com.fasterxml.jackson是在org.codehaus.jackson之上构建的。

愚蠢的错误现在回顾但是学到的宝贵经验总是检查你使用正确的库!!!!

答案 1 :(得分:2)

使用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中的类