什么是Jersey中的ContextResolver和Provider?

时间:2016-06-29 18:26:11

标签: java jersey jax-rs genson

泽西岛的select distinct t1.* from t1 inner join t2 on t2.name = 'Apple' and t2.id in (t1.a, t1.b) 是什么,ContextResolver是什么?两者有什么区别?我正在使用Genson和Jersey。当Jersey在类路径上找到Genson JAR时,Genson会自动注册。 Genson JAR的WEB-INF / services目录包含一个名为“org.glassfish.jersey.internal.spi.AutoDiscoverable”的文件。

Provider路径之后,默认情况下Genson / Jersey自动注册以下类:

AutoDiscoverable

这里有更多的混乱:看看Genson文档,它建议创建一个自定义提供程序,如下所示:

@Provider
@Consumes({MediaType.APPLICATION_JSON, "text/json", "application/*+json"})
@Produces({MediaType.APPLICATION_JSON, "text/json", "application/*+json"})
public class GensonJsonConverter implements MessageBodyReader<Object>, MessageBodyWriter<Object> {

     private final ContextResolver<GensonJaxRSFeature> _gensonResolver;

然而,该提供程序实现了 @Provider public class GensonProvider implements ContextResolver<Genson> { private final Genson genson = new GensonBuilder().setSkipNull(true).create(); } 而不是像{G}内部Genson那样的ContextResolver / Writer。有什么不同?此外,该提供商不会与默认自动注册的提供商相同的事情!特别是,它忽略 JAXB标签,如MessageBodyReader!深入研究@XmlTransient的Genson源代码,我看到Genson对象是这样创建的:

GensonJaxRSFeature

从那里和Genson文档我可以看到“JAXBBundle”可能是导致Genson关注JAXB注释的原因。

主要问题:

我想使用自动注册Jersey的默认Genson JSON提供程序,但我想在其上设置一些自定义属性。正如我所说,当我注册我的自定义提供程序时,它不使用默认的Genson提供程序!

更新

这就是我现在正在做的事情并且它有效。但是,@ eugen下面的解决方案是Genson推荐的解决方案。

private static final Genson _defaultGenson = new GensonBuilder()
      .withBundle(new JAXBBundle())
      .useConstructorWithArguments(true)
      .create();

1 个答案:

答案 0 :(得分:2)

就像我们这个世界上同样存在的问题一样,有多种解决方案。 Jersey似乎鼓励使用ResourceConfig而不是定义自定义提供程序。所以这就是你如何使用资源配置(来自泽西文档here和Genson文档here)来实现它。

public class MyApplication extends ResourceConfig {
    public MyApplication() {
      Genson genson = new GensonBuilder()
              .withBundle(new JAXBBundle())
              .useConstructorWithArguments(true)
              .setSkipNull(true)
              .create();

      register(new GensonJaxRSFeature().use(genson));
    }
}

但是当然你使用提供者的方式也很好。