泽西和Guice以及不错的JSON

时间:2011-06-23 14:25:14

标签: java json serialization jersey guice

我有一个使用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调整为我喜欢的东西。 但是

  • {/ 1}}类非常喜欢在资源上使用无参数构造函数
  • 我的资源非常希望将他们的家属注入他们的构造函数中。

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

2 个答案:

答案 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;
    }
}