json with Jersey: NoClassDefFoundError

Я пытаюсь создать JSON RESTful Webservice с JAX-RS (Джерси). Я также использую Maven для создания приложения.

Мой первый подход

@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;
    }
}

Поэтому я добавил


    com.sun.jersey
    jersey-json
    1.8

к моему файлу pom. Дополнительные файлы lib (например, jackson-cors-asl-1.7.1.jar, jackson-jaxrs-1.7.1.jar, jaxb-impl, ...) также доступны в созданном военном файле. //Редактировать: Он также загружает stax-api-1.0.1.jar и stax-api-1.0-2.jar. Один из этих двух файлов, похоже, допускает ошибку

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)

основная причина:

java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl
com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.(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.(ModelBuilder.java:152)
com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.(RuntimeModelBuilder.java:89)
com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:456)
com.sun.xml.bind.v2.runtime.JAXBContextImpl.(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.(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.(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:

org.codehaus.jackson
            jackson-core-asl
            1.9.11
        
        
            org.codehaus.jackson
            jackson-mapper-asl
            1.9.11
        
        
            org.codehaus.jackson
            jackson-jaxrs
            1.9.11
        
        
            org.codehaus.jackson
            jackson-xc
            1.9.11
        

Но теперь я должен добавить jersey-json.jar вручную.

Есть ли способ добавить два jersey-json двух зависимых, но избегая того, что он загружает файл stax-api.jar?

6
nl ja de
У меня такое же исключение. Потому что мой JBoss пропустил некоторые файлы. Я перешел на новый JBoss. После этого этот вопрос был исправлен.
добавлено автор SANN3, источник
Это Java 1.6 ...
добавлено автор Johannes Staehlin, источник
Какая у вас версия JRE?
добавлено автор gouki, источник
С какой версией Tomcat вы работаете?
добавлено автор Arul Dhesiaseelan, источник

4 ответы

Я считаю, что NoClassDefFoundError вызван из-за конфликтующего JAXB-impl jar, который может присутствовать в вашем пути к классам.

Если вы считаете, что зависимости Jackson и stax-api, связанные с Джерси, вызывают эту проблему (я подозреваю, что это не так), вы можете исключить их из зависимости от jersey-json в вашем maven pom.

    
        com.sun.jersey
        jersey-json
        1.8
        
            
                jettison
                org.codehaus.jettison
            
            
                jackson-core-asl
                org.codehaus.jackson
            
            
                jackson-mapper-asl
                org.codehaus.jackson
            
            
                jackson-jaxrs
                org.codehaus.jackson
            
            
                jackson-xc
                org.codehaus.jackson
            
            
                stax-api
                javax.xml.stream
            
        
    
7
добавлено
Исключение stax-api работало для меня. Я только что отправил ответ 1 минуту назад :) Отметит ваше как правильное. BTW это NoClassDefFoundError, а не ClassNotFoundException.
добавлено автор Johannes Staehlin, источник
Спасибо, что поймали это! Исправлен тип исключения.
добавлено автор Arul Dhesiaseelan, источник

Возможное решение (работало для меня):

Оказалось, что stax поставляется с Java 1.6 . Но Джерси скачал два упомянутых файла бандажа stax. Поэтому я предполагаю, что ошибка возникла из-за наличия дубликатов классов.

Я просто исключил соответствующий пакет в pom.xml и теперь работает:

         
            com.sun.jersey
            jersey-json
            1.14
            
                
                    stax-api
                    stax
                
                
                    stax
                    stax
                
            
        
3
добавлено

Я знаю, что вопрос довольно старый, но, возможно, ответ может быть полезен для будущих поколений;) Я решил проблему, используя


com.sun.xml.bind
jaxb-impl
2.0.1

1
добавлено

As far as I know, JAXB is for xml Binding. If you want JSON you may have a look at http://wiki.fasterxml.com/JacksonJAXBAnnotations

this could be of interest: How to reuse Jersey's JSON/JAXB for serialization?

0
добавлено
Действительно JAXB был оригинальным для XML, JSON поддерживает его, тоже afaik. Проблема возникает гораздо раньше, чем в javax.servlet.ServletException: Servlet.init ()
добавлено автор Johannes Staehlin, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async