web-dev-qa-db-ja.com

RESTEasyクライアント+ NoSuchMethodError

簡単なRESTEasyクライアントを作成しようとしています。以下はサンプルコードです:

Client client = ClientBuilder.newBuilder().build();
WebTarget target = client.target("http://localhost:8080/context/path");
Response response = target.request().post(Entity.entity(object, "application/json"));

//Read output in string format
String value = response.readEntity(String.class);

行で例外が発生します:

Client client = ClientBuilder.newBuilder().build();

コンソールに次のエラーが表示されます。

16:07:57,678 ERROR [stderr] (http-localhost/127.0.0.1:8080-1) Java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.<init>(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V

16:07:57,679 ERROR [stderr] (http-localhost/127.0.0.1:8080-1)   at org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration.<init>(ClientConfiguration.Java:44)

16:07:57,680 ERROR [stderr] (http-localhost/127.0.0.1:8080-1)   at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.Java:317)

16:07:57,680 ERROR [stderr] (http-localhost/127.0.0.1:8080-1)   at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.build(ResteasyClientBuilder.Java:49)

私はpom.xmlにクライアントの依存関係を追加しました:

  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.0.8.Final</version>
  </dependency>

私のコードはJBOSS EAP 6.1にデプロイされています。 JDKのバージョンは1.7です。

更新:私のpomにresteasy jax-rs依存関係を追加してみました。また、web.xmlに次の行を追加して、ResteasyProviderFactoryが有効になっているかどうかを確認しました。

  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>

以下のmaven依存関係のリストを見つけてください:

<dependencies>

    <dependency>
        <groupId>org.jboss.spec.javax.ejb</groupId>
        <artifactId>jboss-ejb-api_3.1_spec</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.0.8.Final</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.0.8.Final</version>
    </dependency>

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.protocol</groupId>
        <artifactId>arquillian-protocol-servlet</artifactId>
        <scope>test</scope>               
    </dependency>

</dependencies>

しかし、それは機能しません。

例外から、何が欠けているのか理解できません。 SOまたはその他のフォーラムでは、この問題に関するリファレンスを見つけることができません。この問題を以前に見たことがあり、それを修正する方法を知っている場合は、お知らせください。ありがとうございます。


2014年6月11日更新:

このブログ を参照した後、resteasyモジュールとjacksonモジュールをいくつか除外して、同様のjboss-deployment-structure.xmlを作成し、EJBプロジェクトのMETA-INFフォルダーに保存してみました。これにより、「org.jboss.resteasy.spi.ResteasyProviderFactory。(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)」に対するNoSuchMethodErrorの問題が解決しました。私のjboss-deployment-structure.xmlの構造は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
   <deployment>
       <exclude-subsystems>
           <subsystem name="resteasy"/>
       </exclude-subsystems>
     <exclusions>
       <!-- <module name="org.Apache.log4j" /> -->
       <module name="org.Apache.commons.logging"/>
       <module name="org.jboss.as.jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-cdi"/>
       <!-- <module name="org.jboss.resteasy.jackson-provider"/>
       <module name="org.jboss.resteasy.resteasy-atom-provider"/>
       <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/>
       <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>
       <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
       <module name="org.jboss.resteasy.resteasy-jsapi"/>
       <module name="org.jboss.resteasy.resteasy-multipart-provider"/>
       <module name="org.jboss.resteasy.resteasy-yaml-provider"/>
       <module name="org.codehaus.jackson.jackson-core-asl"/>
       <module name="org.codehaus.jackson.jackson-jaxrs"/>
       <module name="org.codehaus.jackson.jackson-mapper-asl"/>
       <module name="org.codehaus.jackson.jackson-xc"/>
       <module name="org.codehaus.jettison"/>
       <module name="javax.ws.rs.api"/> -->
     </exclusions>
   </deployment>
 </jboss-deployment-structure>

しかし今、私は他の方法についても同様の例外を見ています:

Caused by: Java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object;
    at com.example.data.DemoProxyBean.callDemoTx(DemoProxyBean.Java:59) [demo-service.jar:]
    at com.example.data.DemoProxyBean$Proxy$_$$_WeldClientProxy.callDemoTx(DemoProxyBean$Proxy$_$$_WeldClientProxy.Java) [demo-service.jar:]

そして、私はこの例外を次の行で見ます:

String value = response.readEntity(String.class);

奇妙なことに、「response.readEntity(String.class)」を検査すると、デバッグ中にString値が表示されます。しかし、次の行に移動しようとすると、このエラーが表示されます。私を案内してください、問題は何ですか?

更なる更新:

私はこれを参照しました JBOSS Issue tracker 。しかし、それはEAPサーバーではなく、WildFlyに関連していました。モジュール「javaee-api」を除外するように求められます。 「javaee-api」モジュールを除外してみましたが、機能しません。

15
user613114

やっと数日間頭を叩いた後、これらの問題を解決することができました。


問題1の解決策:

エラー:「Java.lang.NoSuchMethodError:org.jboss.resteasy.spi.ResteasyProviderFactory。(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)」

解決策:この問題を解決するには、jboss-deployment-structure.xml内の除外リストにRESTEASYモジュールを追加します。 jboss-deployment-structure.xmlの現在の状態は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
   <deployment>
      <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/>
       </dependencies>
       <exclude-subsystems>
           <subsystem name="resteasy"/>
       </exclude-subsystems>
     <exclusions>
        <module name="javax.activation.api"/>
        <module name="javax.annotation.api"/>
        <module name="javax.ejb.api"/>
        <module name="javax.el.api"/>
        <module name="javax.enterprise.api"/>
        <module name="javax.enterprise.deploy.api"/>
        <module name="javax.inject.api"/>
        <module name="javax.interceptor.api"/>
        <module name="javax.jms.api"/>
        <module name="javax.jws.api"/>
        <module name="javax.mail.api"/>
        <module name="javax.management.j2ee.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.resource.api"/>
        <module name="javax.rmi.api"/>
        <module name="javax.security.auth.message.api"/>
        <module name="javax.security.jacc.api"/>
        <module name="javax.servlet.api"/>
        <module name="javax.servlet.jsp.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.ws.rs.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="javax.xml.registry.api"/>
        <module name="javax.xml.soap.api"/>
        <module name="javax.xml.ws.api"/>

        <!-- This one always goes last. -->
        <module name="javax.api"/>

       <module name="org.Apache.commons.logging"/>
       <module name="org.jboss.as.jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-jaxrs"/>
       <module name="org.jboss.resteasy.resteasy-cdi"/>
       <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
       <module name="org.jboss.resteasy.jackson-provider"/>
       <module name="org.jboss.resteasy.resteasy-atom-provider"/>
       <module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/>
       <module name="org.jboss.resteasy.resteasy-jaxb-provider"/>
       <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
       <module name="org.jboss.resteasy.resteasy-jsapi"/>
       <module name="org.jboss.resteasy.resteasy-multipart-provider"/>
       <module name="org.jboss.resteasy.resteasy-yaml-provider"/>
       <module name="org.codehaus.jackson.jackson-core-asl"/>
       <module name="org.codehaus.jackson.jackson-jaxrs"/>
       <module name="org.codehaus.jackson.jackson-mapper-asl"/>
       <module name="org.codehaus.jackson.jackson-xc"/>
       <module name="org.codehaus.jettison"/>
       <module name="javax.ws.rs.api"/>
       <module name="javax.ws.rs.core"/>
     </exclusions>
   </deployment>
 </jboss-deployment-structure>

私は、モジュール「org.jboss.resteasy.resteasy-jaxrs」と「org.jboss.resteasy.resteasy-cdi」を単に除外することによって機能することができたと思います。しかし、私は別の問題に直面したので、それ以上は試みませんでした。不要な除外を削除してみてください。

問題2の解決策:

エラー:「原因:Java.lang.NoSuchMethodError:javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object;」

解決策:JBOSS EAP 6.1は、デフォルトのRESTディストリビューションにバンドルされています。 location から最新のresteasy jax-rs実装(resteasy-jaxrs-3.0.7.Final-all.Zip)をダウンロードしました。

Resteasy-jboss-modules-3.0.7.Final.ZipというZipファイルが付属しています。このファイルをJBoss EAP 6.1ディストリビューションのmodules/system/layers/base /ディレクトリに解凍します。これにより、既存のファイルの一部が上書きされます。これは2番目の問題を解決します。

この情報が他の人に役立つことを願っています。

8
user613114

この問題は、アプリとJboss EAPモジュール間で異なるバージョンのResteasy Client実装が原因でスローされます。最新バージョンのjaxrs-clientを使用していますが、JBoss EAP 6.3.0は非常に古いバージョン(resteasy-jaxrs-2.3.8.Final-redhat-3)を使用しています。

JBoss Resteasy実装の最新パック(たとえば、resteasy-jboss-modules-3.0.9.Final.Zip)をダウンロードし、EAP Modulesフォルダーに解凍して、既存のファイルmodules.xmlを置き換え、新しいjarを追加します。 RemeberはZipからすべてのJARSを置き換えます(resteasy-jaxrsだけでなく)。

9