有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java RestEasyClientBuild寄存器ResteasyJackson2Provider警告重复

我使用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.

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

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

我的选择是什么?我需要将我的ResteasyJackson2Provider版本或者至少是ObjectMapper版本放入客户端。我能用什么方法替换现有的吗


共 (2) 个答案

  1. # 1 楼答案

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

    事实证明,您只需扩展org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider而无需添加/重写任何内容,这样您就可以使用比从类路径(注册时没有优先级)获取的默认org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider更高的优先级来注册它。通过这种方式,您可以确保您的ResteasyJackson2Provider将被选中,而不是通过类路径扫描选择的

    扩展到“自定义”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();
    

    希望这有帮助

  2. # 2 楼答案

    如果您想使用自己打包的“resteasy-jackson2-provider”jar,那么您可以通过使用JBoss部署结构排除以下依赖项来跳过加载我的JBoss提供的resteasy提供程序。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>