在Spring MVC应用程序中用gson替换了杰克逊(不使用弹簧启动),但仍然收到杰克逊依赖项的错误



我创建了一个POC来支持gson,而不是使用Spring MVC 5和Java 8的jackson,但没有使用Spring Boot。
参考教程

即使在从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>

@Configuration 公共类自定义配置 {

@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

也许@triplem之前给出的参考答案会对您有所帮助。它使用的是Spring 5.0而不是Spring Boot。

感谢迪皮卡代表我们发布这个问题。 响应旧线程,但这是问题以及我们如何解决它。

问题即使我们从pom中删除了所有Jackson依赖项.xml并将Spring配置为使用GSON而不是Jackson进行序列化和反序列化,容器仍在尝试加载一些Jackson类,结果抛出了上述异常。原因是我们使用的是JBoss-EAP-7。Jboss 尝试在应用程序运行时加载 Resteasy 模块(JAX-RS,JSR-311,是一个新的 JCP 规范,通过 HTTP 协议为 RESTful Web Services 提供 Java API( 当我们仔细查看它的模块时.xml(位置:EAP-7.1.0\modules\system\layers\base\com\fasterxml\jackson\jaxrs\jackson-jaxrs-json-provider\main(,我们可以看到它需要"com.fasterxml.jackson.core.jackson-databind"依赖项。因此,当 Jboss 无法在 lib 中找到此 JAR 时,它会抛出异常。

解决方案 1:如果你在项目中没有使用 Jboss 的 Resteasy 实现,那么只需从 Jboss 中排除该模块即可。 在 WEB-INF 中创建文件 jboss-deployment-structure.xml(对于 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-provider 的模块.xml(上面提到的路径(。并注释掉下面的杰克逊-数据绑定条目:

<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>

上述两种解决方案都可以完美地工作(我们已经测试过(;如果Jackson不在类路径依赖关系中,它们告诉Spring容器不要加载Jackson模块。

希望这对其他人有所帮助!

最新更新