RestEasyClientBuild注册ResteasyJackson2Provider - 关于重复的WARN

时间:2017-05-10 08:53:23

标签: java jboss jax-rs resteasy

我使用ResteasyClient client = (new ResteasyClientBuilder()) .maxPooledPerRoute(5) .connectionPoolSize(10) .socketTimeout(10L, TimeUnit.SECONDS) .register(jacksonProvider) .register(new RestClientLogger()) .register(new RestClientMDCFilter()) .build(); 以下列方式构建REST客户端:

jacksonProvider

在其中注册的ResteasyJackson2Provider jacksonProvider = new ResteasyJackson2Provider();有一个ObjectMapper,附带一个对反序列化非常重要的自定义10:31:38,414 WARN [org.jboss.resteasy.resteasy_jaxrs.i18n] (default-threads - 1) RESTEASY002155: Provider class org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider is already registered. 2nd registration is being ignored. 。到目前为止,问题是,我在JBoss中得到以下警告:

ResteasyClientBuilder

如果在已经存在之前已注册的同一类的实例的情况下检查文档,这是有意义的。我使用反编译器来检查ResteasyJackson2Provider正在做什么,并且能够看到它扫描类路径以查找包含描述应该注册“内置”提供程序的资源的jar。

其中一个jboss提供的实现现在显然已经定义了ResteasyJackson2Provider在那里注册,使我以后无法注册我自己的实例。

我有什么选择?我需要将ObjectMapper - 或至少{{1}}的版本放入客户端。我可以以某种方式取代现有的吗?

1 个答案:

答案 0 :(得分:6)

我有同样的问题,但我不想删除resteasy-jackson2-provider依赖项,因为我们明确地为系统的其他部分添加了该依赖项(使用了underow,而不是完整的AS)。

事实证明,您可以在不添加/覆盖任何内容的情况下扩展org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder,这样您就可以以比从类路径中选择的org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder更高的优先级注册它(没有优先级注册)。通过这种方式,您可以确保选择jackson2provider而不是通过类路径扫描获取的那个。

扩展到" custom" jackson2provider:

public class CustomResteasyJackson2Provider extends ResteasyJackson2Provider {
}

使用您自定义的ObjectMapper将其插入ResteasyClientBuilder:

ObjectMapper objectMapper = new ObjectMapper();
// customize your objectMapper here...
CustomResteasyJackson2Provider jacksonProvider = new CustomResteasyJackson2Provider();
jacksonProvider.setMapper(objectMapper); // add objectMapper to provider

// register provider to client
ResteasyClient client = new ResteasyClientBuilder()
     .register(jacksonProvider, 100) // any priority over 0 will do
     .build();

希望这有帮助。