2015-05-04 18 views
1

我有獲取崗位要求的身體下面創建在後端是數據的REST API:如何定義模型來解讀後的數據,而不根元素名稱

{ 
    "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> 

這是有道理的,它消失了,當我張貼此JSON:

{ 
    "Entity": { 
    "key": "mykey30", 
    "value": "My New Value" 
    } 
} 

,但我的客戶將張貼像我剛纔粘貼的一個請求,沒有「實體」包裝。

我該如何註釋&定義我的模型忽略根元素?

我使用CXF 3.0.3,春3.2.13.RELEASE &拋棄1.3.5

回答

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

@peeskillet的上述答案很好地工作。

另一個出路是使用Jackson作爲JSON提供者,它支持開箱即用的功能。所有你需要做的就是把它添加到你的bean配置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> 
+0

依賴個人而言,我會用這種方式去。我不知道這是否是您的選擇。我比其他任何JSON處理框架更喜歡Jackson –

相關問題