我有一个使用Jersey 1.7,Guice 3.0的项目,并且有一些JAXB注释类,它们通过资源序列化为XML和JSON。我想根据SO中的几个问题以及Jersey User Guide中的ContextResolver
配置JSON输出。这涉及创建JSONJAXBContext
,如下所示:
public class JaxbResolver implements ContextResolver<JAXBContext> {
private final JAXBContext context;
public JaxbResolver() throws Exception {
this.ctx = new JSONJAXBContext(
JSONConfiguration.
natural().
humanReadableFormatting(true).
build(),
Resource1.class, Resource2.class);
}
/* ... */
}
我的问题是,我的一些资源类具有由Guice注入的依赖项,如下所示:
public class DisplayConfigResource {
private final ConfigRunner cr;
@com.google.inject.Inject
public DisplayConfigResource(ConfigRunner cr) {
this.cr = cr;
}
/* ... */
}
如果我从游戏中移除JaxbResolver
,一切正常,除了我无法控制生成的JSON(默认情况真的很奇怪,比如从单个元素中删除[]
收藏品,...)。所以将ContextResolver
像我一样插入泽西似乎是常识,所以我可以将JSON调整为我喜欢的东西。 但是
所以我的问题是如何解决这种情况并让Jersey,Guice和JSON一起玩得很好?
答案 0 :(得分:2)
您还可以使用Jackson代替JAXB进行JSON编组/解组。它使用相同的@XmlRootElement
,@XmlType
等注释,并产生更标准的输出(并且不需要那些花哨的ContextResolver
自然配置内容。
首先配置你的web.xml:
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
然后在pom.xml中添加jersey-json
依赖项:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.7</version>
</dependency>
答案 1 :(得分:0)
我有类似的问题,我通过创建自定义JAXBContextResolver并手动指定哪些类将与json序列化很好地解决来解决它:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
private Class<?>[] types = {DtoIdNazov.class, DtoLokalitaPoloha.class, DtoListRestauracie.class, DtoDetailRestauracia.class};
public JAXBContextResolver() throws Exception {
JSONConfiguration jsonConfiguration = JSONConfiguration.natural().build();
this.context = new JSONJAXBContext(jsonConfiguration, types);
}
public JAXBContext getContext(Class<?> objectType) {
for (Class<?> type : types) {
if (type == objectType) {
return context;
}
}
return null;
}
}