似乎有很多与Wildfly和Jackson相关的问题,但我无法解决我的问题,尽管搜索网站的广泛...
我想使用Jackson 2来处理部署在Wildfly 10上的应用程序的JSON序列化,但我一直在加载com.fasterxml.jackson.jaxrs.base.ProviderBase
类时遇到困难。
违规代码:
@Provider
public class CustomJsonProvider extends ResteasyJackson2Provider {
@Inject
private CustomSerializer customSerializer;
private List<JsonSerializer<?>> getSerializers() {
final List<JsonSerializer<?>> result = new ArrayList<>();
// Add custom serializers here.
result.add(customSerializer);
return result;
}
@Override
public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
final List<JsonSerializer<?>> serializers = getSerializers();
final ObjectMapper mapper = locateMapper(type, mediaType);
final SimpleModule zeModule = new SimpleModule("App", Version.unknownVersion(), serializers);
mapper.registerModule(zeModule);
this.setMapper(mapper);
super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
}
在我的 pom.xml 中,我有:
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.18.Final</version>
<scope>provided</scope>
<type>jar</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.18.Final</version>
</dependency>
<!-- dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
<version>2.5.4</version>
<scope>provided</scope>
</dependency -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
在 jboss-deployment-structure.xml 文件中:
<deployment>
<exclusions>
<module name="org.apache.commons.logging" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.logmanager.log4j" />
<module name="org.slf4j.impl" />
<module name="org.codehaus.jackson" />
<module name="org.codehaus.jackson.jackson-mapper-asl" />
<module name="org.codehaus.jettison" />
<module name="org.jboss.resteasy.resteasy-jackson-provider" />
<module name="org.jboss.resteasy.resteasy-jettison-provider" />
</exclusions>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/>
</dependencies>
</deployment>
使用此配置,编译和部署顺利进行,但在运行时,我得到以下异常:
引起:java.lang.LinkageError:加载器约束违规:何时 解决被覆盖的方法 “com.my.package.CustomJsonProvider $代理$ _ $ $ WeldClientProxy.disable(LCOM / fasterxml /杰克逊/数据绑定/ SerializationFeature)LCOM / fasterxml /杰克逊/ JAXRS /碱/的ProviderBase;” 类加载器(org / jboss / modules / ModuleClassLoader的实例) 目前的班级, com / my / package / CustomJsonProvider $ Proxy $ $$ _ WeldClientProxy,及其 超类加载器(org / jboss / modules / ModuleClassLoader的实例), 具有不同类型的Class对象 com / fasterxml / jackson / jaxrs / base / ProviderBase用于签名
根据我收集的内容,Wildfly的类加载器加载了不同版本的ProviderBase
。所以我认为使用提供的版本可以解决问题(可能存在意外实现差异的副作用,但仍然存在)。
问题是,如果我取消注释POM中的注释依赖项,事实上使用Wildlfy中提供的com.fasterxml.jackson.jaxrs:jackson-jaxrs-base
版本,它会在运行时再次抱怨:
引起:java.lang.ClassNotFoundException: 来自[Module。的com.fasterxml.jackson.jaxrs.base.ProviderBase “deployment.myapp耳-0.1-SNAPSHOT.ear.myapp核-0.1-SNAPSHOT.jar:主” 来自服务模块加载器]
这似乎是一个冲突的类加载器的问题。 我缺少什么,如何解决这个问题?