如何定义模型以解组 post 没有根元素名称的数据

How to define model to unmarshall post data without root element name

我有一个 REST API,它在 post 请求正文中跟随以在后端创建该数据:

{
  "key": "mykey30",
  "value": "my long value"
}

这就是我定义模型的方式:

@XmlRootElement
public class Entity {

  private String key;
  private String value;
}

这就是我定义服务端点的方式:

@POST
@Produces({ MediaType.APPLICATION_JSON })
@Path("/buckets/{bucket_id}/entities/{key}")
public CacheResponse createEntity(Entity entity, @PathParam("bucket_id") String bucket_id, @PathParam("key") String key);

我现在遇到这个异常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"key"). Expected elements are <{}cacheEntity>

这是有道理的,当我 post 这个 json:

时它就消失了
{
  "Entity": {
    "key": "mykey30",
    "value": "My New Value"
  }
}

但我的客户会 post 像我之前粘贴的请求一样,没有 "Entity" 包装器。

如何注释和定义我的模型以忽略根元素?

我正在使用 cxf 3.0.3、Spring 3.2.13.RELEASE 和 Jettison 1.3.5

您只需配置JSONProvider

使用 xml 配置,您可能会有类似

的内容
<jaxrs:server [...] >
    [...]
    <jaxrs:providers>
        <bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
            <property name="dropRootElement" value="true"/>
            <property name="supportUnwrapped" value="true"/>
        </bean>
    </jaxrs:providers>
</jaxrs:server>

Maven 依赖项(我假设您已经拥有)

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-extension-providers</artifactId>
    <version>3.0.3</version>
</dependency>

@peeskillet 的上述回答效果很好。

另一种出路是使用 Jackson 作为 JSON 提供者,它开箱即用地支持此功能。您所要做的就是将其添加到您的 beans 配置中 xml:

<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>

并且这是您 pom.xml

中的依赖项
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.4.6</version>
    </dependency>