java – 泽西和Guice以及不错的JSON

我有一个使用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插入到Jersey中似乎是常识,所以我可以将JSON调整为我喜欢的东西.但

> JSONJAXBContext类非常喜欢在资源上使用no-arg构造函数
>我的资源非常希望在他们的构造函数中注入他们的dependecies.

所以我的问题是如何解决这种情况并让Jersey,Guice和JSON很好地融合在一起?

最佳答案 您也可以使用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>
点赞