2017-05-10 59 views
1

我使用org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder建立以下列方式REST客戶端:RestEasyClientBuild註冊ResteasyJackson2Provider - 警告重複

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加入客戶端。我能否以某種方式替換現有的?

回答

1

如果你想使用你自己打包的'resteasy-jackson2-provider'jar包,那麼你可以通過使用jboss-deployment-structure.xml排除下面的依賴關係來跳過加載resteasy提供者的方式提供了我的JBoss ,

<?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> 
1

我有同樣的問題,但我沒有要刪除的RestEasy的-jackson2提供商的依賴,因爲我們補充說,明確依賴該系統的其他部分(使用的暗流,不完整的AS)。

原來,只需擴展org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder而不添加/覆蓋任何內容,因此您可以使用比從類路徑中獲取的org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder更高的優先級註冊它(註冊時沒有優先級)。通過這種方式,您可以確保您的jackson2提供者將被選擇爲通過類路徑掃描獲取的那個。

延伸到 「自定義」 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(); 

希望這有助於。