提问者:小点点

从泽西岛的 1.9 升级到杰克逊 2.0 不起作用


我正在使用杰克逊(泽西岛)序列化实体,并且我正在从杰克逊 1.9 迁移到 2.0。我遵循了本指南,起初似乎一切都很容易解决。

但是仔细观察会发现Jackson 1.9仍被用于序列化我的响应,因此忽略了我的(迁移的)Jackson 2.0注释。您可以在以下代码片段中看到我使用了哪些注释:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public abstract class IdEntity {

@Id
@JsonDeserialize(using = ObjectIdJsonDeserializer.class)
protected ObjectId id;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonSerialize(using = ObjectIdJsonSerializer.class)
public ObjectId getId() {
    return id;
}

public void setId(ObjectId id) {
    this.id = id;
}

@JsonIgnore
public String getIdAsString() {
    return id == null ? "" : id.toString();
}

我的@JsonIgnore getter正在被序列化,并且我的ObjectIdJsonSerializer没有用于ObjectId字段。

在调试中,我可以看到正在使用的对象映射器来自1.9。

我已经删除了Jackson 1.9的所有直接maven依赖项,并尝试向jersey-json添加排除项,以防止它引入Jackson 1.9。但是我不能完全摆脱它(通过在我的依赖管理中对所有codehouse. jackson内容进行排除),因为我也在使用需要Jackson 1.9的Spring AMQP。

对此有什么想法吗?有人遇到过/解决过类似的问题吗?我如何强制新泽西使用杰克逊2.0?


共3个答案

匿名用户

我在回答我自己的问题,基于StaxMan和pgelinas的(有用的)答案。

我必须做两件事才能让它成功。

第一件事是从我的网络中删除com.sun.jersey.api.json.POJOMappingFeature.xml。

第二个是将我的jackson jaxrs json提供程序(实际上,我的所有jackson工件)更新到2.1。

使用2.1或2.0以及POJOMappingFeature,Jackson 1.9仍然被用于序列化。

在2.0中,删除了POJOMappingFeature,我得到了一个缺少消息正文编写器的错误。

随着2.1和POJOMappingFeature的删除,一切都按预期工作。

匿名用户

仅仅升级Jackson core和mapper版本是不够的;Jersey(或任何JAX-RS实施)和Jackson之间的集成使用特定的JAX-RS提供商。对杰克森来说,这就是https://github.com/FasterXML/jackson-jaxrs-json-provider.

因此,您还需要添加2. x Jackson JAX-RS JSON提供程序,这将使泽西使用Jackson 2.x进行操作。

匿名用户

如果您的类路径中没有两个版本的Jackson,我会仔细检查。Jackson 2.x中的包名从< code>org.codehaus更改为< code>com.fasterxml。这样你就不会有一些神秘的类路径问题(比如< code>NoClassDefFound),但是如果你没有使用正确的包,你将会看到这种行为。

此外,注释被提取到他们自己的项目杰克逊注释中。