2013-03-04 30 views
1

我正在嘗試使用Jersey的功能從我的Web服務方法生成JSON。 一切正常,但後來我發現,對於對象列表JSON表示包含像封閉根標籤。我發現我可以使用JSONConfiguration.natural()配置基於JAXB的JSON支持來產生理想的結果。所以我寫了下面Jersey基於JAXB的JSON支持

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 

    private final Set<Class> types; 

    private final Class[] cTypes = {TrRegion.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; 
    } 
} 

並插入它在這樣

public class WebServiceApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() 
    { 
     Set<Class<?>> resources = new HashSet<Class<?>>(); 

     resources.add(OrderInfrastructureResource.class); 
     resources.add(OrderResource.class); 

     resources.add(JAXBContextResolver.class); 

     return resources; 
    } 
} 

    <servlet> 
    <description>JAX-RS Tools Generated - Do not modify</description> 
    <servlet-name>JAX-RS Servlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.[...].WebServiceApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

但由於某些原因,我總是得到

java.lang.IllegalStateException: No JAXB provider found for the following JAXB context: class com.sun.xml.bind.v2.runtime.JAXBContextImpl 
    at com.sun.jersey.json.impl.JSONHelper.getJaxbProvider(JSONHelper.java:106) [jersey-json-1.17.jar:1.17]  
at com.sun.jersey.json.impl.JSONHelper.getJaxbProvider(JSONHelper.java:106) [jersey-json-1.17.jar:1.17] 
at com.sun.jersey.json.impl.DefaultJaxbXmlDocumentStructure.getXmlDocumentStructure(DefaultJaxbXmlDocumentStructure.java:76) [jersey-json-1.17.jar:1.17] 
at com.sun.jersey.json.impl.writer.Stax2JacksonWriter.<init>(Stax2JacksonWriter.java:169) [jersey-json-1.17.jar:1.17] 
at com.sun.jersey.json.impl.Stax2JsonFactory.createWriter(Stax2JsonFactory.java:105) [jersey-json-1.17.jar:1.17] 
at com.sun.jersey.json.impl.provider.entity.JSONListElementProvider.writeList(JSONListElementProvider.java:133) [jersey-json-1.17.jar:1.17] 

有人能告訴我爲什麼嗎?

當我改變線

this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes); 

this.context = new JSONJAXBContext(JSONConfiguration.mapped().build(), cTypes); 

它開始工作,但給人包圍根標記(以及它是與不指定任何ContextResolver)。奇怪(奇怪的意思,那個區別只在於我提供的映射類型)。

我嘗試在禁用Restesy的情況下在Jboss 7.1.1上運行我的應用程序(我從standalone.xml文件中刪除了行<extension module="org.jboss.as.jaxrs"/><subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>)。我也使用com.sun.jersey.spi.spring.container.servlet.SpringServlet作爲Jersey servlet。

請告訴我我錯過了什麼。 可能是什麼問題?

回答

0

顯然我錯過了JAXB的IMPL庫我的應用程序,所以我只是增加了JBoss的com.sun.xml.bind模塊在我的JBoss部署結構文件如下:

<dependencies> 
    <module name="com.sun.xml.bind" /> 
    <module name="org.codehaus.jackson.jackson-core-asl" /> 
    <module name="org.codehaus.jackson.jackson-jaxrs" /> 
    <module name="org.codehaus.jackson.jackson-mapper-asl" /> 
    <module name="org.codehaus.jackson.jackson-xc" /> 
</dependencies>