无法在Jersey 2.0中为Jackson启用基于POJO的JSON绑定支持

时间:2013-07-07 10:21:29

标签: java jersey jackson

我正在使用Jersey制作JSON(通过Jackson的POJO映射)和Jetty(从main方法开始)。
它适用于Jersey 1.x。:

ServletHolder sh = new ServletHolder(ServletContainer.class);
sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
                        "com.sun.jersey.api.core.PackagesResourceConfig");
sh.setInitParameter("com.sun.jersey.config.property.packages", "service");
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
...
context.addServlet(sh, "/rest/*");
Server server = new Server(8080);
server.setHandler(context);
server.start();

现在我将我的项目迁移到Jersey 2.0并且未能在其中启用基于POJO的JSON绑定,我得到以下内容: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class business.entity.ExampleEntity, genericType=class business.entity.ExampleEntity.

显然,com.sun.jersey.api.json.POJOMappingFeature不再有效,因为泽西岛会转到org.glassfish

documentation说出以下内容:

  

为了使用Jackson作为您的JSON(JAXB / POJO)提供程序,您需要在Configurable(客户端/服务器)中为ObjectMapper(如果需要)注册JacksonFeature和ContextResolver。

但在我的情况下,我无法弄清楚如何正确地做到这一点。

我为这个问题创建了一点project

branch master - 泽西岛1.17.1的工作示例;

分支jersey-2.0-migration - 没有尝试迁移到Jersey 2.0 - 测试失败;

branch jersey-2.0-migrate-client-only - 使用Jersey客户端2.0与Jersey服务器1.17.1进行非工作尝试 - 测试失败

问题是:如何在Jersey 2.0中启用基于POJO的JSON绑定

2 个答案:

答案 0 :(得分:15)

文档有点过时了。最新的Jackson版本提供了一个可自动发现的提供程序。将以下jar添加到类路径:

1)jackson-annotations-2.2.2.jar

2)jackson-core-2.2.2.jar

3)jackson-databind-2.2.2.jar

4)jackson-jaxrs-base-2.2.1.jar

5)jackson-jaxrs-json-provider-2.2.1.jar

6)jackson-module-jaxb-annotations-2.2.2.jar

确保将“com.fasterxml.jackson.jaxrs.json”添加到“jersey.config.server.provider.packages”servlet配置属性中,以便可以自动发现Jackson json提供程序。

答案 1 :(得分:3)

我个人很喜欢@ jontro的评论/回答...所以我会重新发布它作为答案而不是评论,这样人们就不会错过它(希望没关系)。

看看https://github.com/FasterXML/jackson-jaxrs-providers哪里有新的杰克逊jaxrs提供者(来自杰克逊项目,而不是泽西项目)。

请注意,这会带来Jackson2依赖关系(jackson-core-2.2.3.jar等),而不是jersey-media-json-jackson带来的Jackson1依赖关系(jackson-core-asl-1.9.13.jar等) 。

对于我使用jersey 2.5的maven项目,这转化为:

删除依赖项:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.5.1</version>
</dependency>

添加依赖项:

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

感谢@ user2562639和@jontro。