无法在Jersey 2.0中为Jackson启用基于POJO的JSON绑定支持 [英] Can't enable POJO based JSON binding support for Jackson in Jersey 2.0
问题描述
我正在使用Jersey来制作JSON(通过杰克逊的POJO映射)和Jetty(从主方法开始)。
它适用于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 / *);
服务器服务器=新服务器(8080);
server.setHandler(context);
server.start();
现在我将我的项目迁移到Jersey 2.0并且未能在其中启用基于POJO的JSON绑定,我得到了以下内容:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= application / json的MessageBodyWriter,type = class business.entity.ExampleEntity,genericType = class business。 entity.ExampleEntity。
显然, com.sun.jersey.api.json.POJOMappingFeature
不再有效,因为泽西岛去了 org.glassfish
documentation 说以下内容:
为了使用Jackson作为您的JSON(JAXB / POJO)提供程序,您需要在Configurable(客户端/服务器)中注册JacksonFeature和ObjectMapper的ContextResolver(如果需要)。
但在我的情况下,我无法弄清楚如何正确地做到这一点。
我为这个问题创建了一个小小的项目:
branch master
- Jersey 1.17.1的工作示例;
branch jersey-2.0-migration
- 没有尝试迁移到Jersey 2.0 - 测试失败;
分支 jersey-2.0-migrate-client-only
- 非工作尝试使用Jersey客户端2.0与工作的Jersey服务器1.17.1 - 测试失败。
<强>问题是:如何启用基于JSON POJO在Jersey 2.0结合强>
文档有点过时了。最新的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
'p> 6)杰克逊模块-JAXB的注解-2.2.2.jar
确认添加com.fasterxml.jackson .jaxrs.json到jersey.config.server.provider.packagesservlet配置属性,因此可以自动发现Jackson json提供程序。
I'm using Jersey to produce JSON (with POJO mapping through Jackson) and Jetty (start from main method).
It works perfect for 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();
Now I migrated my project to Jersey 2.0 and failed to enable POJO based JSON binding in it, I get the following:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class business.entity.ExampleEntity, genericType=class business.entity.ExampleEntity.
Obviously, com.sun.jersey.api.json.POJOMappingFeature
no longer valid as Jersey goes to org.glassfish
The documentation say the following:
In order to use Jackson as your JSON (JAXB/POJO) provider you need to register JacksonFeature and a ContextResolver for ObjectMapper (if needed) in your Configurable (client/server).
But I can't figure out how to do it correctly in my case.
I created a little project for this question:
branch master
- worked example for Jersey 1.17.1;
branch jersey-2.0-migration
- not working attempt to migrate to Jersey 2.0 - test failed;
branch jersey-2.0-migrate-client-only
- non working attempt to use Jersey client 2.0 with working Jersey server 1.17.1 - test failed.
Question is: how to enable POJO based JSON binding in Jersey 2.0
The documentation is a bit outdated. The latest Jackson build provides an auto-discoverable provider. Add the following jars to the class path:
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
Make sure to add "com.fasterxml.jackson.jaxrs.json" to the "jersey.config.server.provider.packages" servlet config property, so the Jackson json provider can be auto-discovered.
这篇关于无法在Jersey 2.0中为Jackson启用基于POJO的JSON绑定支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!