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

时间:2015-05-04 18:22:57

标签: spring rest jaxb cxf jax-rs

我有一个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

2 个答案:

答案 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

使用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>