我使用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}}的版本放入客户端。我可以以某种方式取代现有的吗?
答案 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();
希望这有帮助。