我有一个REST API,它在post请求体中跟随在后端创建数据:
df2 <- data.frame(x = c(1,2,2), y = c(30,10,18))
x y
1 30
2 10
2 18
这就是我定义模型的方式:
{
"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);
这是有道理的,当我发布这个json时它会消失:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"key"). Expected elements are <{}cacheEntity>
但是我的客户会发布我之前粘贴的请求,而不是&#34;实体&#34;包装。
我如何注释&amp;定义我的模型以忽略根元素?
我使用的是cxf 3.0.3,Spring 3.2.13.RELEASE&amp; Jettison 1.3.5
答案 0 :(得分:1)
@peeskillet的上述答案效果很好。
另一种方法是使用Jackson作为JSON提供程序,它支持开箱即用的此功能。您所要做的就是将它添加到您的beans config 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>
答案 1 :(得分:0)
您只需配置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>