7

我正在使用 Jackson(在泽西岛)来序列化实体,并且我正在从 Jackson 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 字段。

在调试中,我可以看到正在使用的 ObjectMapper 来自 1.9。

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

关于如何管理这个的任何想法?有没有人遇到/解决过类似的问题?如何强制 Jersey 使用 Jackson 2.0?

4

4 回答 4

8

我正在根据 StaxMan 和 pgelinas 的(有用的)答案回答我自己的问题。

我必须做两件事才能让它发挥作用。

首先是从我的 web.xml中删除com.sun.jersey.api.json.POJOMappingFeature 。

第二个是将我的jackson-jaxrs-json-provider(实际上是我所有的 Jackson 工件)更新为2.1

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

使用 2.0 并删除 POJOMappingFeature 后,我收到了缺少消息正文编写器的错误。

删除 2.1 和 POJOMappingFeature 后,一切都按预期工作。

于 2013-04-11T12:15:43.087 回答
5

仅仅升级 Jackson core 和 mapper 版本是不够的;Jersey(或任何 JAX-RS 实现)和 Jackson 之间的集成使用特定的 JAX-RS 提供程序进行。对于杰克逊,这将是https://github.com/FasterXML/jackson-jaxrs-json-provider

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

于 2013-04-10T21:27:19.133 回答
2

如果您的类路径中没有两个版本的 Jackson,我会仔细检查。Jackson 2.x 中的软件包名称已更改为com.fasterxmlfrom org.codehaus。这样您就没有一些神秘的类路径问题(例如 a NoClassDefFound),但是如果您不使用正确的包,这就是您将看到的那种行为。

此外,注释被提取到他们自己的项目jackson-annotations中。

于 2013-04-08T14:01:54.380 回答
-1

即使您升级到杰克逊 2,您也会在使用旧杰克逊时出现 NoClassfound 错误。

在此链接上检查 spring 实现:http: //git.springsource.org/sandbox/cbeams/blobs/4731d671cbeb82b87dd0f10e16cd09d8f267b433/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/json /MappingJacksonJsonView.java

于 2013-08-29T00:40:41.527 回答