Spring Boot忽略@JsonDeserialize和@JsonSerialize。

11

我有一个使用Spring Boot框架的应用程序,其中包含RESTful端点。我想为joda-time添加自定义序列化器,但是我无法让应用程序默认的Jackson序列化器识别我的自定义序列化器。

我使用@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识别这些序列化器呢?


请展示您尝试序列化的代码位置。 - Sotirios Delimanolis
@jbarrueta,Jackson 版本为 2.5.3。 - Schokea
你在尝试反序列化吗? - Sotirios Delimanolis
所以请编辑您的问题以澄清一切。您有一个REST端点(请展示它),该端点接收JSON,并希望使用JSON 反序列化器(而不是序列化器)以自定义方式反序列化JSON。您目前向我们展示了一个JsonSerializer,但如果您想要反序列化某些内容,那就不太好用了。 - Sotirios Delimanolis
@Schokea 不是你的问题,但你知道 jackson 的 joda 时间扩展库 "jackson-datatype-joda" 吗? - ci_
显示剩余5条评论
2个回答

9

好的,经过长时间的折磨,我找到了答案。我在序列化和反序列化joda-datetime时使用了错误的库。

我使用的是

org.codehaus.jackson

但实际上应该使用

com.fasterxml.jackson

由于com.fasterxml.jackson是基于org.codehaus.jackson构建的,两个库具有几乎相同的属性和方法,所以这可能是一个容易犯的错误。

现在回头看,这是一个愚蠢的错误,但也是一个宝贵的教训,一定要始终检查是否使用了正确的库!!!


2
我也犯了同样的错误!真不敢相信自己会这么容易地使用错误的类/框架。 - Stefan

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接