Landister
Landister

Reputation: 2224

CXF Working on jboss EAP 6

Currently working on getting a CXF web service up and running on JBOSS EAP 6. I currently have it running and working for the most part but every time there is a verification issue I get the following error.

08:58:49,180 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/data-api].[CXFServlet]] (http-/0.0.0.0:8080-2) JBWEB000236: Servlet.service() for servlet CXFServlet threw exception: java.lang.NoSuchMethodError: javax.ws.rs.InternalServerErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status;)Ljavax/ws/rs/core/Response;

I am assuming it is a version conflict but I have already excluded the JBoss jaxrs subsystem. Has anyone else had this issue?

jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
  <deployment>
    <exclude-subsystems>
      <subsystem name="resteasy" />
      <subsystem name="jaxrs" />
      <subsystem name="webservices" />
    </exclude-subsystems>
    <exclusions>
    <module name="javax.ws.rs.api"/>
    <module name="org.apache.cxf"/>
    <module name="org.apache.cxf.impl"/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>data-api</display-name>
  <welcome-file-list>
    <!-- Should implement a welcome page at some point -->
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.data.api.rest.ConfigApplication</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.application.address.ignore</param-name>
        <param-value>true</param-value>
    </init-param>


    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>




  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>

        <!-- Hibernate -->
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
        <version>4.3.6.Final</version>
        </dependency>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.6.Final</version>
        </dependency>

        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-validator</artifactId>
        <version>5.1.2.Final</version>
        </dependency>





         <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-bundle</artifactId>
        <version>2.7.13</version>
        </dependency>



        <dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-xc</artifactId>
          <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-jaxrs</artifactId>
            <version>1.9.13</version>
        </dependency>


        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.31</version>
        </dependency>


  </dependencies>

  <build>
    <finalName>${project.artifactId}</finalName>

    <plugins>
      <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
      </plugin>
      <plugin>
    <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
    <artifactId>maven-java-formatter-plugin</artifactId>
      </plugin>
      <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
      <overlays>

      </overlays>
      <archive>
        <manifestEntries>
          <Dependencies>org.apache.httpcomponents</Dependencies>
        </manifestEntries>
      </archive>
    </configuration>
      </plugin>
      <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
      </plugin>
      <plugin>
    <groupId>org.jboss.as.plugins</groupId>
    <artifactId>jboss-as-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Upvotes: 2

Views: 2206

Answers (1)

jfx
jfx

Reputation: 383

This is the easiest solution to exclude JAX-RS API in your WAR only using jboss-deployment-structure.xml (without having to modify the Jboss standalone.xml):

  1. exclude the module javaee.api completely

  2. re-import the module javaee.api and exclude the JAX-RS classes

That's it!

Verified on Jboss EAP 6.2

jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <deployment>
     <dependencies>
        <!-- Exclude JAX-RS: 2. re-import the javaee.api and exclude the JAX-RS classes -->
        <module name="javaee.api" >
            <imports>
                <exclude path="javax/ws/**" />
            </imports>
        </module>
    </dependencies>
    <exclusions>
        <!-- Exclude JAX-RS: 1. exclude the javaee.api completely -->
           <module name="javaee.api" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

This brings the HTTP 500 without any stacktrace/NoSuchMethodExceptions to the invoker and clean Jackson Exceptions in the Jboss log file:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of byte out of VALUE_STRING token

Also see this for the way to the solution.

In case you still have troubles with the Jboss-supplied JAX-RS subsystem (e.g. when trying to generate CXF Swagger-API I got a java.lang.LinkageError: ClassCastException: attempting to castjar:file:/c:/jboss//modules/system/layers/base/javax/ws/rs/api/main/jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar!/javax/ws/rs/ext/RuntimeDelegate.class to vfs:/c:/jboss/bin/content/myapp.war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar/javax/ws/rs/ext/RuntimeDelegate.class), then you can also exclude the whole jaxrs-subsystem:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
  <deployment>
  ...
    <exclude-subsystems>
        <subsystem name="jaxrs" />
    </exclude-subsystems>  
  </deployment>
</jboss-deployment-structure>  

Upvotes: 2

Related Questions