2012-10-18 13 views
6

我正在使用Jersey爲服務器組件創建Web服務。不幸的是,我的JSON響應格式有問題,因爲數據總是格式化爲字符串。針對JSON序列化的JAXB批註POJO返回每個字段類型的字符串

我有不同的字段類型的簡單JAXB註釋POJO:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class JaxbPojo { 

    @XmlElement(name = "id_64") 
    private Long id; 

    @XmlElement(name = "desc") 
    private String description; 

    private Boolean active; 

    // getters and setters 
    .. 
} 

和AA簡單的資源,返回傳入對象:

@Path("/jaxb_pojo") 
public class JaxbPojoResource { 

    @POST 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    @Produces({ MediaType.APPLICATION_JSON }) 
    public JaxbPojo processBidRequest(JaxbPojo pojo) { 
     return pojo; 
    } 

} 

當發送到所述資源的請求具有以下JSON數據,該對象在資源方法內正確填充。但字段類型返回的JSON數據總是被格式化爲字符串:

[email protected]:/tmp $ cat simple_jaxb_pojo 
{"id_64":99,"desc":"simple JAXB POJO","active":true} 

[email protected]:/tmp $ curl -X POST -H "Content-Type: application/json" --data-binary @simple_jaxb_pojo http://localhost/srvr/rest/jaxb_pojo 
{"id_64":"99","desc":"simple JAXB POJO","active":"true"} 

所有使用jar文件(JSR311-API-1.1.1.jar,球衣核-1.6.jar,新澤西州JSON-1.6 .jar,jersey-server-1.6.jar)直接包含在tomcat/lib路徑中。在JAX-RS庫通過的Maven的pom.xml與範圍「提供的」使用:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>jsr311-api</artifactId> 
    <version>1.1.1</version> 
    <scope>provided</scope> 
</dependency> 

我的web.xml文件看起來是這樣的:

<servlet> 
    <servlet-name>RestServlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.rest.RestResourcesApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

.. 

<servlet-mapping> 
    <servlet-name>RestServlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

我缺少的東西或者我可能到明確地配置傑克遜使用我的POJO類型。我對這個主題相當陌生,所以我發佈了關於此的所有信息。我希望有人能幫幫忙。

回答

1

有趣的問題。我不確定發生這種情況的原因,但嘗試添加:

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

添加到您在web.xml中的Jersey servlet定義中。我認爲Jersey需要這個來產生JSON,但是當我刪除這個init-param時,我看到了與你相同的問題。

+0

感謝您的回答。但是添加了這個,我得到了下面的異常:SEVERE:沒有找到用於Java類..JaxbPojo和Java類型類型..JaxbPojo以及MIME媒體類型application/json的消息正文閱讀器 18.10.2012 18:56:43 com .sun.jersey.spi.container。ContainerRequest getEntity SEVERE:與MIME媒體類型兼容的已註冊郵件正文閱讀器是: application/json - > com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider $ App com.sun.jersey.json .impl.provider.entity.JSONRootElementProvider $ App com.sun.jersey.json.impl.provider.entity.JSONListElementProvider $ – henne83

+0

你確定'jersey-json'依賴項在你的類路徑中(並且它的範圍是正確的你的POM)?我嘗試從我的POM中刪除它,並得到了與您所做的相同的例外。 – condit

+0

有趣的事情,它的工作原理,當我刪除提供裏面的球衣依賴關係的pom.xml。設置範圍字段後,它將引發上述異常。 – henne83

1

user463324的解決方案很好。通常,您可以使用此解決方案將Java對象轉換爲JSON並返回。它基於傑克遜圖書館。

如果您想獲得基於JAXB的JSON,那麼提供了一些配置選項,以便您可以控制事情如何序列化和反序列化。對於默認配置,你會得到字符串格式,就像你指出的問題一樣。

要實現更重要的JSON格式更改,您需要配置Jersey JSON處理器本身。可以在JSONConfiguration實例上設置各種配置選項。然後該實例可以進一步用於創建JSONConfigurated JSONJAXBContext,該JSONJAXBContext用作此區域中的主要配置點。要通過你的專業JSONJAXBContext澤西島,你將最終需要實現的JAXBContext ContextResolver:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 
    private final Set<Class> types; 
    private Class[] ctypes = { JaxbPojo.class}; 
    public JAXBContextResolver() throws Exception { 
     this.types = new HashSet(Arrays.asList(ctypes)); 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), 
       ctypes); 
    } 

    @Override 
    public JAXBContext getContext(Class<?> objectType) { 
     return (types.contains(objectType)) ? context : null; 
    } 
} 

您可以參考jersey' official document的詳細信息。

+0

感謝您的回覆。我現在要堅持使用user463324的方法。 – henne83

相關問題