java - 在没有 @XMLRootElement 的情况下将 JSON 对象解码为 Java

标签 java json rest cxf jax-rs

我正在使用 apache-cxf 作为实现来开发 JAX-RS。我有一个 POST 服务,在将 JSON 对象解码到 Java 时遇到以下 400 错误,没有 @XMLRootElement。

javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“客户”)

资源类别:

@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>

JSON

{
"Customer":
{
    "Id": null,
    "ExternalKey": [
        {
            "NaturalKey": "NaturalKey0",
            "KeyName": "KeyName0",
            "SourceSystem": "XYZ"
        },
        {
            "NaturalKey": "NaturalKey1",
            "KeyName": "KeyName1",
            "SourceSystem": "Sys"
        }
    ],
    "MetaData": {
        "ObjectVersion": "50",
        "ObjectState": "Synchronized",
        "CreatedTime": "2006-05-04T18:13:51.0",
        "ModifiedBy": "ModifiedBy0",
        "ModifiedTime": "2006-05-04T18:13:51.0",
        "Verified": "false"
    },
    "EffectiveDate": "2006-05-04",
    "CustomerType": "ABC",
    "CustomerName": "CustomerName0",
    "CustomerTag": [
        {
            "Key": "Customer Number",
            "Value": "Value0"
        },
        {
            "Key": "Customer EID",
            "Value": "Value1"
        }
    ]
}
}

我尝试添加 Jettison作为提供者但运气不好

最佳答案

我可以通过添加 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> 

虽然我还没有找到我脑海中出现的几个问题的答案 -
1.为什么仅在 POST 请求的情况下我们需要 JSONProvider ?对于 GET 请求,我可以获取 JSON 对象作为响应,而无需添加 JSONProvider。
2.如果我在客户对象中有 @XMLRootElement,我再次不需要 JSONProvider 和服务工作,为什么?

关于java - 在没有 @XMLRootElement 的情况下将 JSON 对象解码为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21192879/

相关文章:

java - PESSIMISTIC_WRITE 是否锁定了整个表?

java - 通过 Jackson ObjectMapper 将参数化 url 反序列化为 java.net.URI 时出现 InvalidFormatException

jquery - 将 JQuery 数据转换为 HighChart 格式

java - 支持 JAX-RS 中的查询参数

java - 使用 runnable 强制关闭应用程序

java - 在java中计算平均值

java - 寻找一种从 Java 中的给定 SQL 查询创建动态 SQL 的方法

javascript - 从服务器端解析 json 对象

java - 如何在 Android 中将 cURL 发送到 REST 服务

azure - 使用 Azure 数据工厂进行 API 调用时出现错误 500