RESTEasy Client + NoSuchMethodError
I am trying to write simple RESTEasy client. Below given is sample code:
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);
I get exception at line:
Client client = ClientBuilder.newBuilder().build();
I see following errors in my console:
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)
I have added resteasy client dependancy in pom.xml as:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.8.Final</version>
</dependency>
My code is deployed on JBOSS EAP 6.1. JDK version is 1.7.
Update: I also tried adding resteasy jax-rs dependancy in my pom. I also verified if ResteasyProviderFactory is enabled by adding following lines in my web.xml:
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
Please find below list of maven dependancies:
<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>
But it doesnt work.
From exception, I am not able to figure out what is missing. I am not able to find any references for this issue on SO or any other forums. Please let me know, if you have seen this issue earlier and you know how to fix it. Thanks.
Update 11 June 2014:
After referring this blog and by excluding some resteasy and jackson modules, I tried creating similar jboss-deployment-structure.xml and keeping it in META-INF folder in my EJB project. This solved my issue of NoSuchMethodError for "org.jboss.resteasy.spi.ResteasyProviderFactory.(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)" . Structure of my jboss-deployment-structure.xml is:
<?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>
But now I see similar exception for other method:
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:]
And I see this exception at line:
String value = response.readEntity(String.class);
Weird thing is that, when I inspect "response.readEntity(String.class)", while debugging, I can see the String value. But when I try to go to step to next line, I see this error. Can you please guide me, what could be the issue?
Further update:
I referred to this JBOSS Issue tracker. But it was related to WildFly, and not EAP server. It asks us to exclude module "javaee-api". I tried excluding "javaee-api" module, but it also does not work.
This problems are thrown cause of different version of Resteasy Client implementation between your app and Jboss EAP modules. You are using the newest version of jaxrs-client, but JBoss EAP 6.3.0 use very old version (resteasy-jaxrs-2.3.8.Final-redhat-3).
Just download latest pack of JBoss Resteasy implementation (sometking like this: resteasy-jboss-modules-3.0.9.Final.zip) and unzip into EAP Modules folder replacing existing files modules.xml and adding new jars. Remeber replace all JARS from the ZIP (not only resteasy-jaxrs).
At last after banging my head for couple of days, I could resolve these issues.
Solution for issue 1:
Error: "java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)"
Solution: I resolved this issue, by adding more resteasy modules in exclusion list inside jboss-deployment-structure.xml. My current state of jboss-deployment-structure.xml is as:
<?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>
I believe, it could have worked by simply excluding modules "org.jboss.resteasy.resteasy-jaxrs" and "org.jboss.resteasy.resteasy-cdi". But I did not try further as I faced another issue. You can try by removing un-necessary exclusions.
Solution for issue 2:
Error: "Caused by: java.lang.NoSuchMethodError: javax.ws.rs.core.Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object;"
Solution: JBOSS EAP 6.1, is bundled with default resteasy distribution. I downloaded latest resteasy jax-rs implementation (resteasy-jaxrs-3.0.7.Final-all.zip) from location.
It comes with zip file called resteasy-jboss-modules-3.0.7.Final.zip. Unzip this file inside modules/system/layers/base/ directory of the JBoss EAP 6.1 distribution. This will overwrite some of the existing files there. This will resolve second issue.
Hope this information would help others.