我正在嘗試使用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。
請告訴我我錯過了什麼。 可能是什麼問題?