不使用@XMLRootElement将JSON对象解组到Java
我正在使用ApacheCXF实现JAX-RS。我有一个POST服务,在没有@XMLRootElement的情况下,将JSON对象解组为Java不使用@XMLRootElement将JSON对象解组到Java,java,json,rest,cxf,jax-rs,Java,Json,Rest,Cxf,Jax Rs,我正在使用ApacheCXF实现JAX-RS。我有一个POST服务,在没有@XMLRootElement的情况下,将JSON对象解组为Java,出现以下错误 javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“Customer”) 资源类别: @POST @Path("/create") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Consumes(
,出现以下错误
javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“Customer”)
资源类别:
@POST
@Path("/create")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response createCustomer(Customer customer) throws Exception {
------
-------
}
JAXB对象:中没有@XMLRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Customer", propOrder = {
"id",
"effectiveDate",
"customerType",
"customerName",
---
})
public class Customer extends ObjectBase implements Serializable
{
}
应用程序上下文:
<jaxrs:server id="restContainer" address="/">
<jaxrs:serviceBeans>
<ref bean="customerResource"/>
</jaxrs:serviceBeans>
</jaxrs:server>
我尝试将其添加为提供程序,但运气不好,我可以通过将JAX-RS提供程序添加为JSONProvider来解决这个问题。在JSONProvider中,为JSON指定相应的命名空间。在本例中,我使用了空字符串
<util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
<entry key="http://www.mycompany.com/abc/xyz/v1" value=""/>
</util:map>
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="namespaceMap" ref="jsonNamespaceMap"/>
<property name="dropRootElement" value="false"/>
<property name="ignoreMixedContent" value="true"/>
<property name="serializeAsArray" value="true"/>
</bean>
虽然我还没有找到我脑海中出现的几个问题的答案-
一,。为什么我们只在POST请求的情况下需要JSONProvider?对于GET请求,我可以获取JSON对象作为响应,而无需添加JSONProvider。
二,。如果我在customer对象中有@XMLRootElement,我也不需要JSONProvider和服务,为什么?手动执行时JAXBElement
而不是YourClass
工作。也许你可以写一个拦截器来做这个?你的json请求是什么?。。。。。。。。你能用JSON更新你的帖子吗Request@KaPra我现在添加了JSON请求。
<util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
<entry key="http://www.mycompany.com/abc/xyz/v1" value=""/>
</util:map>
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="namespaceMap" ref="jsonNamespaceMap"/>
<property name="dropRootElement" value="false"/>
<property name="ignoreMixedContent" value="true"/>
<property name="serializeAsArray" value="true"/>
</bean>