заменил Джексона на gson в весеннем приложении MVC (не используя весеннюю загрузку), но все еще получал ошибку для зависимости Джексона - PullRequest
0 голосов
/ 25 сентября 2018

Я создал POC для поддержки gson вместо Джексона с Spring MVC 5 и Java 8, но без использования Spring Boot.
Справочное руководство

Даже после удаления поддержки связывания jackson из pom.xml и использования gson выдает ошибку:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException
    Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: 

Запись Pom.xml:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.4</version>
</dependency>

@ Конфигурация public classCustomConfiguration {

@Bean
public AbstractJsonHttpMessageConverter customConverters() {

    Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();

    GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
    messageConverters.add(gsonHttpMessageConverter);

    return gsonHttpMessageConverter;
}

}

Dependency Graph 
[INFO] +- com.oracle:ojdbc6:jar:11.2.0.3:compile
[INFO] +- com.google.code.gson:gson:jar:2.8.4:compile
[INFO] +- org.springframework:spring-core:jar:5.0.7.RELEASE:compile
[INFO] |  \- org.springframework:spring-jcl:jar:5.0.7.RELEASE:compile
[INFO] +- org.hibernate:hibernate-core:jar:5.2.11.Final:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  +- org.javassist:javassist:jar:3.20.0-GA:compile
[INFO] |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.1.Final:compile
[INFO] |  +- org.jboss:jandex:jar:2.0.3.Final:compile
[INFO] |  +- com.fasterxml:classmate:jar:1.3.0:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  \- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile
[INFO] +- org.springframework:spring-web:jar:5.0.7.RELEASE:compile
[INFO] |  \- org.springframework:spring-beans:jar:5.0.7.RELEASE:compile
[INFO] +- org.springframework:spring-jdbc:jar:5.0.7.RELEASE:compile
[INFO] +- org.springframework:spring-tx:jar:5.0.7.RELEASE:compile
[INFO] +- org.springframework:spring-webmvc:jar:5.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-aop:jar:5.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:5.0.7.RELEASE:compile
[INFO] |  \- org.springframework:spring-expression:jar:5.0.7.RELEASE:compile
[INFO] +- org.springframework:spring-orm:jar:5.0.7.RELEASE:compile
[INFO] +- org.springframework:spring-test:jar:5.0.7.RELEASE:test
[INFO] +- org.springframework.data:spring-data-jpa:jar:2.0.8.RELEASE:compile
[INFO] |  +- org.springframework.data:spring-data-commons:jar:2.0.8.RELEASE:compile
[INFO] |  \- org.aspectj:aspectjrt:jar:1.8.13:compile
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:compile
[INFO] +- log4j:log4j:jar:1.2.17:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.5:test
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] +- org.hibernate:hibernate-validator:jar:4.3.2.Final:compile
[INFO] +- javax.validation:validation-api:jar:1.1.0.Final:provided
[INFO] +- org.apache.commons:commons-lang3:jar:3.7:compile
[INFO] \- junit:junit:jar:4.12:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Спасибо Deepika за размещение этого вопроса от нашего имени.Отвечая на старый поток, но вот проблема и то, как мы ее решили.

Проблема Несмотря на то, что мы удалили все зависимости Джексона из pom.xml и настроили Spring для использования GSON, а не Джексона дляПри сериализации и десериализации контейнер пытался загрузить некоторые классы Джексона и, в результате, выбрасывал указанное выше исключение.Причина в том, что мы использовали JBoss-EAP-7 .Jboss пытается загрузить модуль Resteasy во время выполнения приложения (JAX-RS, JSR-311, является новой спецификацией JCP, предоставляющей API Java для веб-служб RESTful по протоколу HTTP). Когда мы внимательно рассмотрим его module.xml (расположение: EAP-7.1.0 \ modules \ system \ layer \ base \ com \ fastxml \ jackson \ jaxrs \ jackson-jaxrs-json-provider \ main), мы видим, что для этого требуется "com.fasterxml.jackson.core.jackson-databind"зависимость.Итак, Jboss выдает исключение, когда не удается найти этот JAR-файл в lib.

Решение 1: Если вы не используете реализацию Jboss Resteasy в своем проекте, просто исключите этот модуль из Jboss,Создайте файл jboss-deploy-structure.xml в WEB-INF (для проекта JBoss WAR это расположение такое же, как и в jboss-web.xml).

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
                <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
       </exclusions>
    </deployment>
</jboss-deployment-structure>

Решение 2: Откройте файл jackson-jaxrs-json-providerr.xml (путь указан выше).И закомментируйте запись jackson-databind ниже:

<module xmlns="urn:jboss:module:1.5" name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider">
     <resources>
        <resource-root path="jackson-jaxrs-json-provider-2.8.9.redhat-1.jar"/>
        <resource-root path="jackson-jaxrs-base-2.8.9.redhat-1.jar"/>
        <resource-root path="jackson-module-jaxb-annotations-2.8.9.redhat-1.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.ws.rs.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="com.fasterxml.jackson.core.jackson-annotations"/>
        <module name="com.fasterxml.jackson.core.jackson-core"/>
        <!--<module name="com.fasterxml.jackson.core.jackson-databind"/>-->
    </dependencies>
</module>

Оба вышеуказанных решения работают отлично (мы тестировали);они говорят контейнеру Spring не загружать модули Джексона, если Джексон не присутствует в зависимости от пути к классам.

Надеюсь, это поможет другим!

0 голосов
/ 29 сентября 2018

Вероятно этот ответ из ссылки, предоставленной @triplem ранее, поможет вам.Он использует Spring 5.0, а не Spring Boot.

...