Java 什么是Jersey中的ContextResolver和Provider?

Java 什么是Jersey中的ContextResolver和Provider?,java,jersey,jax-rs,genson,Java,Jersey,Jax Rs,Genson,什么是泽西岛的上下文解析器,什么是提供者?这两者的区别是什么?我用的是Genson和Jersey。Jersey在类路径上找到Genson JAR时,Genson将自动注册。Genson JAR的WEB-INF/services目录包含一个名为“org.glassfish.jersey.internal.spi.AutoDiscoverable”的文件 在该AutoDiscoverablepath之后,默认情况下Genson/Jersey会自动注册以下类: @Provider @Consumes(

什么是泽西岛的
上下文解析器
,什么是
提供者
?这两者的区别是什么?我用的是Genson和Jersey。Jersey在类路径上找到Genson JAR时,Genson将自动注册。Genson JAR的WEB-INF/services目录包含一个名为“org.glassfish.jersey.internal.spi.AutoDiscoverable”的文件

在该
AutoDiscoverable
path之后,默认情况下Genson/Jersey会自动注册以下类:

@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;
从这一点和Genson文档中,我可以看到“JAXBBundle”可能是促使Genson关注JAXB注释的原因

主要问题:

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


更新:

这就是我现在正在做的事情,而且很有效。但是,@eugen提供的以下解决方案是Genson推荐的解决方案

@Provider
public class GensonProvider implements ContextResolver<GensonJaxRSFeature> {
    private final GensonJaxRSFeature _gensonResolver = new GensonJaxRSFeature();

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

   @Override
   public GensonJaxRSFeature getContext(Class<?> type) {
        return _gensonResolver.use(_defaultGenson);
   }
}
@Provider
公共类GensonProvider实现ContextResolver{
private final GensonJaxRSFeature _gensonResolver=new GensonJaxRSFeature();
私有静态最终Genson _defaultGenson=新GensonBuilder()
.withBundle(新的JAXBBundle())
.useConstructorWithArguments(true)
.setSkipNull(真)
.create();
@凌驾
公共GensonJaxRSFeature getContext(类类型){
返回_gensonResolver.use(_defaultGenson);
}
}

就像在我们的世界里一样,对于同一个问题,有多种解决方案。 Jersey似乎鼓励使用ResourceConfig,而不是定义自定义提供者。这就是如何使用资源配置(来自jersey文档和Genson文档)实现它的方法


当然,您使用提供者的方式也很好。

您怎么说Genson建议定义自定义提供者?至少当前文档建议使用配置了GensonJaxRSFeature的ResourceConfig,该功能使用自定义Genson实例。您不应该更改默认genson实例。如果你想要另一个配置,只需用你想要的配置创建另一个实例。@eugen看看我的编辑,看看我做了什么。Genson文档中推荐的代码是“new ResourceConfig().register(new GensonJaxRSFeature().use(myCustomGenson).disableSerializationFor(String.class));”。它的功能与我现在所做的相同,只是我使用了一个提供程序,而不是通常放置“newresourceconfig”代码的地方。“新资源配置”通常会去哪里?您可以发布一个示例或链接吗?检查如何使用ResourceConfig。无法获取默认genson实例并对其进行修改。只需提供您自己想要的任何配置。是的,如果您想让Genson使用JAXB注释,您需要将其配置为使用此捆绑包。@eugen这对我来说没有意义,我已经读了3遍了。我还看到过其他一些例子,它们说在web xml中使用package.ClassName,并使您的类扩展应用程序。如果这就是您所提倡的,我仍然不知道您将代码“new ResourceConfig().register(new GensonJaxRSFeature().use(myCustomGenson).disableSerializationFor(String.class))”放在哪里,因为这些示例通常只调用register(…)。“如果你不想给我举个例子,那就随你怎么办,但解释还没有通过。”尤金,再问一个问题。你一直在暗示我的做法是错误的,然而,我测试了它,它工作了。为什么您认为具有我上面提到的ContextResolver的提供者不应该工作?无论如何,感谢您迄今为止的帮助。谢谢,我想我只是对Genson文档中的b/c感到困惑,它说要创建一个“新的ResourceConfig()”,而在这个解决方案中不是这样。您正在创建新的GensonBuilder,但从未创建新的ResourceConfig()。不管怎样,我现在明白了。。我主要是想确保我没有错过“new ResourceConfig”这篇文章中的一些重要内容……不,你不会错过任何东西。资源配置似乎是jersey希望我们放置配置部分的地方,但是您当前的解决方案也很好。是的,这里我们不创建资源配置,而是扩展它。在泽西岛的其他一些用法中,人们会实例化它(我认为jetty+Jersey就是这样)。
private static final Genson _defaultGenson = new GensonBuilder()
      .withBundle(new JAXBBundle())
      .useConstructorWithArguments(true)
      .create();
@Provider
public class GensonProvider implements ContextResolver<GensonJaxRSFeature> {
    private final GensonJaxRSFeature _gensonResolver = new GensonJaxRSFeature();

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

   @Override
   public GensonJaxRSFeature getContext(Class<?> type) {
        return _gensonResolver.use(_defaultGenson);
   }
}
public class MyApplication extends ResourceConfig {
    public MyApplication() {
      Genson genson = new GensonBuilder()
              .withBundle(new JAXBBundle())
              .useConstructorWithArguments(true)
              .setSkipNull(true)
              .create();

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