【问题标题】:Can't enable POJO based JSON binding support for Jackson in Jersey 2.0无法在 Jersey 2.0 中为 Jackson 启用基于 POJO 的 JSON 绑定支持
【发布时间】:2013-07-04 21:04:35
【问题描述】:

我正在使用 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 - Jersey 1.17.1 的工作示例;

branch 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 绑定

【问题讨论】:

    标签: java jersey jackson


    【解决方案1】:

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

    1) jackson-annotations-2.2.2.jar

    2) jackson-core-2.2.2.jar

    3) jackson-databind-2.2.2.jar

    4) 杰克逊-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 提供程序。

    【讨论】:

    • 它对我有用!十分感谢!我在 GitHub jersey-2.0-migrate-server-successjersey-2.0-migration-success 上为我的小 project 添加了两个新分支,它们描述了解决方案并通过了测试!
    • 我也可以使用jersey-media-json-jackson 2.0(请参阅jersey-2.0-migration 的更新),但如果没有jersey-client 2.0,它会收到comments 中提到的警告
    • 数小时的痛苦一去不复返了。莫西默默地失败了,我不得不搬回杰克逊,我准备把头从窗户里探出来。感谢您的回答。
    • 查看 github.com/FasterXML/jackson-jaxrs-providers 以获得易于使用的 maven 依赖项
    • 当我这样做时,它会随机使用 JacksonJsonProvider 或 JacksonJaxbJsonProvider。我使用 JAXB 注释,所以如果它碰巧使用 JacksonJsonProvider,它会忽略它们并且我的应用程序会中断。强制使用 JacksonJaxbJsonProvider 的正确方法是什么?
    【解决方案2】:

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

    看看 https://github.com/FasterXML/jackson-jaxrs-providers 那里有新的 jackson jaxrs 提供者(来自 jackson 项目而不是 jersey 项目)。

    请注意,这会带来 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。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 2015-12-01
      • 2015-12-19
      • 2013-01-08
      • 2020-06-04
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多