Jersey 2.2和MOXy下使用JAXBElement处理JSON的问题

Jersey 2.2和MOXy下使用JAXBElement处理JSON的问题,json,jaxb,jersey,moxy,jaxbelement,Json,Jaxb,Jersey,Moxy,Jaxbelement,我扩展了moxy代码以使用XML模式定义,而不是JAXB注释bean。xjc编译的XML模式生成与原始示例相同的XML和JSON编码 我按照jersey的说明,使用ObjectFactory在CustomerResource.java中生成JAXBElement客户对象表示。我还按照描述修改了客户机。我还合并了中描述的修复 MediaType.APPLICATION\u XML功能完美,并且MediaType.APPLICATION\u JSON适用于GET,但客户端无法在PUT上使用“Mess

我扩展了moxy代码以使用XML模式定义,而不是JAXB注释bean。xjc编译的XML模式生成与原始示例相同的XML和JSON编码

我按照jersey的说明,使用ObjectFactory在CustomerResource.java中生成JAXBElement客户对象表示。我还按照描述修改了客户机。我还合并了中描述的修复

MediaType.APPLICATION\u XML功能完美,并且MediaType.APPLICATION\u JSON适用于GET,但客户端无法在PUT上使用“MessageBodyWriter not found”来处理JSON。将引发以下异常:

testJsonCustomer(org.glassfish.jersey.examples.jaxbmoxy.MoxyAppTest)  Time elapsed: 0.113 sec  <<< ERROR!
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class javax.xml.bind.JAXBElement, genericType=class javax.xml.bind.JAXBElement.
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:191)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:268)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1005)
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:430)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:290)

谢谢你的帮助

您面临的问题是:

Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));
基本上,您将
JAXBElement
传递给
Entity#json
方法,但是运行时没有关于泛型类型的信息,您需要提供它。这就是上课的目的:

webTarget
    .request(MediaType.APPLICATION_JSON)
    .put(Entity.json(new GenericEntity<JAXBElement<Customer>>(factory.createCustomer(customer)) {}));
webTarget
.request(MediaType.APPLICATION_JSON)
.put(Entity.json(新的GenericeEntity(factory.createCustomer(customer)){});

这绝对解决了我的问题。json运行时处理JAXBElement的方式与xml运行时不同,有什么具体原因吗?你有没有可能在某个地方提到这一点,这样我就可以进一步阅读,以避免差异中的额外陷阱?
Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));
webTarget
    .request(MediaType.APPLICATION_JSON)
    .put(Entity.json(new GenericEntity<JAXBElement<Customer>>(factory.createCustomer(customer)) {}));