我正在使用CXF rest客户端,它适用于简单的数据类型(例如:字符串,整数).但是,当我尝试使用自定义对象时,我得到了这个:
Exception in thread "main" org.apache.cxf.interceptor.Fault: .No message body writer found for class : class com.company.datatype.normal.MyObject.
at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:523)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:438)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:177)
at $Proxy13.execute(Unknown Source)
at com.company.JaxTestClient.main(JaxTestClient.java:26)
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: .No message body writer found for class : class com.company.datatype.normal.MyObject.
at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:491)
at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:515)
... 5 more
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
JaxExample jaxExample = JAXRSClientFactory.create( "http://localhost:8111/", JaxExample.class );
MyObject before = ...
MyObject after = jaxExample.execute( before );
Run Code Online (Sandbox Code Playgroud)
这是界面中的方法:
@POST
@Path( "execute" )
@Produces( "application/json" )
MyObject execute( …Run Code Online (Sandbox Code Playgroud) 我正在使用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();
Run Code Online (Sandbox Code Playgroud)
现在我将我的项目迁移到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
该文件说以下内容:
为了使用Jackson作为您的JSON(JAXB/POJO)提供程序,您需要在Configurable(客户端/服务器)中为ObjectMapper(如果需要)注册JacksonFeature和ContextResolver.
但在我的案例中,我无法弄清楚如何正确地做到这一点.
我为这个问题创建了一个小项目:
分支master- 泽西岛1.17.1的工作示例;
分支jersey-2.0-migration- 没有工作尝试迁移到Jersey 2.0 - 测试失败 ;
分支jersey-2.0-migrate-client-only- 非工作尝试使用泽西岛客户端2.0与工作泽西服务器1.17.1 - 测试失败.
问题是:如何在Jersey 2.0中启用基于POJO的JSON绑定