【问题标题】:Spring boot jackson auto configuration linkage error wildflyspring boot jackson自动配置联动报错wildfly
【发布时间】:2016-01-14 02:18:35
【问题描述】:

A.war -> 是一个简单的 spring boot REST 应用,使用版本 1.2.6.RELEASE(内部使用 spring 4.1.7 RELEASE,jackson 2.4.6)

B.jar -> 是一个 wildfly9 共享模块(存储在 wildfly/modules 中),它使用包含 spring 框架的 maven shaded 插件打包(没有 spring boot 的含义,使用添加 spring 项目依赖项的旧方法)和相同的 jackson 类版本如上。 (它的阴影是因为非弹簧和非容器项目可以在他们的类路径中添加这个 jar 并使用它 - 它有效)

A.war 具有 maven 依赖项 scope <provided> on B.jar 并具有 jboss-deployment-structure.xml 和 <dependencies> <module name = "B"> </dependencies> A.war 部署失败并出现以下错误。

注意:当我删除 B.jar jboss 依赖项时,A.war 部署得非常好。所以添加 B.jar 会导致这个问题。如果我不在 A.war 中使用 spring boot(意味着如果我直接使用简单的 spring webmvc 和上下文依赖项)和 B.jar jboss 依赖项,A.war 也可以完美部署

谁能解释一下下面的错误是什么,我该如何调查更多?

据我对 wildlfy 类加载的理解,A.war 和 B.jar 应该加载到不同的模块类加载器中,A.war 是否在错误中抱怨 B.jar 的杰克逊类?

Caused by: java.lang.LinkageError: loader constraint violation: when resolving method
 "org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.modulesToInstall([Lcom/fasterxml/jackson/databind/Module;)Lorg/springframework/http/converter/json/Jackson2ObjectMapperBuilder;"
 the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class,
 org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration,
 and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class,
 org/springframework/http/converter/json/Jackson2ObjectMapperBuilder,
 have different Class objects for the type der used in the signature
 at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.configureModules(JacksonAutoConfiguration.java:259)
 at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.jacksonObjectMapperBuilder(JacksonAutoConfiguration.java:186)
 at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.CGLIB$jacksonObjectMapperBuilder$1()
 at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0$$FastClassBySpringCGLIB$$5262bf2.invoke()
 at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
 at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318)
 at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.jacksonObjectMapperBuilder()
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
 at java.lang.reflect.Method.invoke(Method.java:606)
 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 108 more

【问题讨论】:

    标签: jboss jackson spring-boot wildfly


    【解决方案1】:

    在调查了更多的 jboss 类加载行为后,B.jar 中的 jackson 类与 jboss retesay 模块中的相同 jackson 类发生冲突。 因此在 jboss-deployment-structure.xml 中排除它们后,如下所示,此问题已修复..

    <exclusions>
         <module name="org.jboss.resteasy.resteasy-jackson-provider"/> 
         <module name="org.jboss.resteasy.resteasy-jackson2-provider"/> 
    </exclusions> 
    

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 2017-01-19
      • 2018-09-09
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2017-12-11
      相关资源
      最近更新 更多