RestEasyClientBuild 注册 ResteasyJackson2Provider - 关于重复的警告

RestEasyClientBuild register ResteasyJackson2Provider - WARN about duplicate

我正在使用 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();

那里注册的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.

如果我在之前已经注册过相同 class 的实例的情况下检查文档,这是有道理的。我使用了一个反编译器来检查 ResteasyClientBuilder 正在做什么并且能够看到,它扫描 class 路径以查找包含描述 "built in" 提供商应注册的资源的 jar。

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

我在这里有哪些选择?我需要将我的 ResteasyJackson2Provider 或至少 ObjectMapper 版本导入客户端。我能以某种方式替换现有的吗?

如果你想使用你自己打包的 'resteasy-jackson2-provider' jar,那么你可以跳过加载 resteasy 提供程序的方法之一提供我的 JBoss 通过使用 [=16= 排除以下依赖项]-部署-structure.xml,

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
            <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

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

原来你可以只扩展 org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider 而没有 adding/overriding 任何东西所以你可以注册它比从类路径中获取的默认 org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider 更高的优先级(已注册没有优先权)。通过这种方式,您可以确保您的 ResteasyJackson2Provider 将被选中,而不是通过类路径扫描选择的那个。

扩展到 "custom" ResteasyJackson2Provider:

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();

希望对您有所帮助。