users@jersey.java.net

[Jersey] class of "MessageBodyReader" cannot be loaded when jackson-jaxrs.jar is in place

From: Chen, Wei D <wei.d.chen_at_intel.com>
Date: Fri, 23 Aug 2013 07:13:41 +0000

Our current project includes some jersey jar package and Jackson jar packages, but seems these jar binary cannot works well in
tomcat container.

 

If we remove "jackson-jaxrs.jar" from the /WEB-INF/lib directory and add "jsr311-api-1.1.1.jar" to that directory, we notice
"javax.ws.rs.ext.MessageBodyReader" is loaded from "catalina.out".

[Loaded javax.ws.rs.ext.MessageBodyReader from file:/var/lib/tomcat7/webapps/***/WEB-INF/lib/jsr311-api-1.1.1.jar]

this seems a correct behavior but we saw follow issue after invoking API from the console.

SEVERE: A message body reader for Java class ***, and Java type class ***, and MIME media type application/json was not found.

The registered message body readers compatible with the MIME media type are:

application/json ->

  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App

  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App

  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App

  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App

  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App

*/* ->

  com.sun.jersey.core.impl.provider.entity.FormProvider

  com.sun.jersey.core.impl.provider.entity.StringProvider

  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider

  com.sun.jersey.core.impl.provider.entity.FileProvider

  com.sun.jersey.core.impl.provider.entity.InputStreamProvider

  com.sun.jersey.core.impl.provider.entity.DataSourceProvider

  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProv

 

 

seems we need also add "jackson-jaxrs.jar" to /WEB-INF/lib directory, but we hit follow issue this time if we add
"jackson-jaxrs.jar".

...

javax.servlet.ServletException: Servlet.init() for servlet ServletAdaptor threw exception

        org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)

        org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)

        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

        org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)

        org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)

        org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)

        java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

        java.lang.Thread.run(Thread.java:722)

</pre></p><p><b>root cause</b> <pre>java.lang.NoClassDefFoundError: javax/ws/rs/ext/MessageBodyReader

        java.lang.ClassLoader.findBootstrapClass(Native Method)

        java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1057)

        java.lang.ClassLoader.loadClass(ClassLoader.java:412)

        java.lang.ClassLoader.loadClass(ClassLoader.java:410)

...

actually this class "javax/ws/rs/ext/MessageBodyReader" is in this jar "jsr311-api-1.1.1.jar" or "jersey-core.jar", but this class
do haven't been loaded as we cannot find any class loading information from "catalina.out" this time.

 

 

 

web.xml:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <servlet>

        <servlet-name>ServletAdaptor</servlet-name>

        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

        <init-param>

            <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>

            <param-value>com.***FilterFactory</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>ServletAdaptor</servlet-name>

        <url-pattern>/resources/*</url-pattern>

    </servlet-mapping>

    <session-config>

        <session-timeout>

            30

        </session-timeout>

    </session-config>

    <welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

    <listener>

        <listener-class>com.***Manager</listener-class>

    </listener>

</web-app>

 

 

This is a big trouble for us, it's really make me headache and we nearly despair as no workaround approach seems work so far, any
helps?

Great appreciation for any of inputs!

 

Best Regards,

Dave Chen