RestEasyClientBuild注册ResteasyJackson2Provider - 关于重复的WARN

Yan*_*ann 5 java jboss jax-rs resteasy

我使用org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder以下面的方式构建REST客户端:

ResteasyClient client = (new ResteasyClientBuilder())
    .maxPooledPerRoute(5)
    .connectionPoolSize(10)
    .socketTimeout(10L, TimeUnit.SECONDS)
    .register(jacksonProvider)
    .register(new RestClientLogger())
    .register(new RestClientMDCFilter())
    .build();
Run Code Online (Sandbox Code Playgroud)

jacksonProvider那里注册的是一个ResteasyJackson2Provider jacksonProvider = new ResteasyJackson2Provider();带有ObjectMapper对反序列化很重要的自定义.到目前为止,问题是,我在JBoss中得到以下警告:

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.
Run Code Online (Sandbox Code Playgroud)

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

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

我有什么选择?我需要得到我的版本ResteasyJackson2Provider- 或者至少是我的版本ObjectMapper.我可以以某种方式取代现有的吗?

小智 10

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

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

扩展到"自定义"jackson2提供者:

public class CustomResteasyJackson2Provider extends ResteasyJackson2Provider {
}
Run Code Online (Sandbox Code Playgroud)

使用您自定义的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();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.