json with Jersey: NoClassDefFoundError

24,536

Solution 1

I believe the NoClassDefFoundError is caused because of a conflicting JAXB-impl jar which may be present in your classpath.

If you think, Jackson and stax-api dependencies bundled with Jersey are causing this problem (I suspect that is not the case), you can exclude them from jersey-json dependency in your maven pom.

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
        <exclusions>
            <exclusion>
                <artifactId>jettison</artifactId>
                <groupId>org.codehaus.jettison</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jackson-core-asl</artifactId>
                <groupId>org.codehaus.jackson</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jackson-mapper-asl</artifactId>
                <groupId>org.codehaus.jackson</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jackson-jaxrs</artifactId>
                <groupId>org.codehaus.jackson</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jackson-xc</artifactId>
                <groupId>org.codehaus.jackson</groupId>
            </exclusion>
            <exclusion>
                <artifactId>stax-api</artifactId>
                <groupId>javax.xml.stream</groupId>
            </exclusion>
        </exclusions>
    </dependency>

Solution 2

Possible solution (worked for me):

It turned out that stax comes with Java 1.6. But jersey downloaded the two mentioned stax jar files. So I guess the error occured because there are duplicate classes.

I just excluded the corresponding package in the pom.xml and it works now:

         <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.14</version>
            <exclusions>
                <exclusion>
                    <artifactId>stax-api</artifactId>
                    <groupId>stax</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>stax</artifactId>
                    <groupId>stax</groupId>
                </exclusion>
            </exclusions>
        </dependency>

Solution 3

I know the question is quite old, but maybe the answer might be usefull for the future generations ;) I solved the problem using

<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.0.1</version>
</dependency>
Share:
24,536
Johannes Staehlin
Author by

Johannes Staehlin

Updated on July 09, 2022

Comments

  • Johannes Staehlin
    Johannes Staehlin almost 2 years

    I am trying to build a JSON RESTful Webservice with JAX-RS (Jersey). I'm also using Maven to build the App.

    My first approach was

    @Path("/Person")
    public class PersonService {
        @GET
        public String getPersonService() {
            Personperson= new Person();
            person.setLocationCode("MEL");
            person.setName("Johannes");
            return person.getName();
        }
    }
    

    After pom.xml->clean install + Run On Server it works and the output is as execpted. But I would like to use JAXB to get the Person in JSON Format with all it's attributes:

    @Path("/Person")
    public class PersonService {
        @GET
        public Person getPersonService() {
            Personperson= new Person();
            person.setLocationCode("MEL");
            person.setName("Johannes");
            return person;
        }
    }
    

    So I added

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
    

    to my pom file. The additional lib files (e.g. jackson-cors-asl-1.7.1.jar, jackson-jaxrs-1.7.1.jar, jaxb-impl,... ) are also available in the generated war file. //Edit: It also downloads stax-api-1.0.1.jar and stax-api-1.0-2.jar One of theese two files seem to let the error occur

    Error: But calling /Person (or any other Service) leads to an Error:

    javax.servlet.ServletException: Servlet.init() for servlet CloudAPIService threw exception
        org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        com.sap.security.auth.service.webcontainer.internal.Authenticator.invoke(Authenticator.java:147)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:169)
        com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:84)
        com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
        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:312)
        java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        java.lang.Thread.run(Thread.java:662)
    

    root cause:

    java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl
    com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.<init>(RuntimeTypeInfoSetImpl.java:61)
    com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:129)
    com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:81)
    com.sun.xml.bind.v2.model.impl.ModelBuilder.<init>(ModelBuilder.java:152)
    com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:89)
    com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:456)
    com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1136)
    com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
    com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
    com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:202)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:133)
    javax.xml.bind.ContextFinder.find(ContextFinder.java:286)
    javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372)
    javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337)
    javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:244)
    com.sun.jersey.server.impl.wadl.WadlApplicationContextImpl.<init>(WadlApplicationContextImpl.java:72)
    com.sun.jersey.server.impl.wadl.WadlFactory.init(WadlFactory.java:97)
    com.sun.jersey.server.impl.application.RootResourceUriRules.initWadl(RootResourceUriRules.java:169)
    com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:106)
    com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1298)
    com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:169)
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:775)
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:771)
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771)
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:766)
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:488)
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318)
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609)
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556)
    javax.servlet.GenericServlet.init(GenericServlet.java:244)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    com.sap.security.auth.service.webcontainer.internal.Authenticator.invoke(Authenticator.java:147)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:169)
    com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:84)
    com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
    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:312)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:662)
    

    Current workaround: Instead of adding the jersey-json dependency, I added jackson dependencies directly:

    <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-asl</artifactId>
                <version>1.9.11</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>1.9.11</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-jaxrs</artifactId>
                <version>1.9.11</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-xc</artifactId>
                <version>1.9.11</version>
            </dependency>
    

    But now I have to add the jersey-json.jar manually.

    Is there a way two add jersey-json two depenedencies, but avoiding that it downloads the stax-api.jar's ??

  • Johannes Staehlin
    Johannes Staehlin over 11 years
    Indeed JAXB was originall for XML, JSON supports it, too afaik. The problem occurs much earlier while in javax.servlet.ServletException: Servlet.init()
  • Johannes Staehlin
    Johannes Staehlin over 11 years
    The exclusion of the stax-api worked for me. I just posted the answer 1 minute ago :) Will mark yours as correct. BTW it's a NoClassDefFoundError and not ClassNotFoundException.
  • Arul Dhesiaseelan
    Arul Dhesiaseelan over 11 years
    Thanks for catching that! Fixed the exception type.