如何定义模型以解组 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
。
- 编组(展开)的 属性 是
setDropRootElement(boolean)
- 解组(允许解包)的 属性 是
setSupportUnwrapped(boolean)
使用 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>
我有一个 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
。
- 编组(展开)的 属性 是
setDropRootElement(boolean)
- 解组(允许解包)的 属性 是
setSupportUnwrapped(boolean)
使用 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>