似乎有很多与Wildfly和Jackson相关的问题,但是尽管在广泛的网站上搜索,但我无法解决我的问题...
我想使用Jackson 2来处理部署在Wildfly 10上的应用程序的JSON序列化,但是我一直在加载 com.fasterxml.jackson.jaxrs.base.ProviderBase
类 .
Offending code:
@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 $ Proxy $ _ $$ WeldClientProxy.disable(Lcom / fasterxml / jackson / databind / SerializationFeature;)Lcom / fasterxml / Jackson / JAXRS /碱/的ProviderBase;”当前类的类加载器(org / jboss / modules / ModuleClassLoader的实例),com / my / package / CustomJsonProvider $ Proxy $$$ _ WeldClientProxy及其超类加载器(org / jboss / modules / ModuleClassLoader的实例),签名中使用的com / fasterxml / jackson / jaxrs / base / ProviderBase类型的不同Class对象
根据我收集的内容,Wildfly的类加载器加载了不同版本的 ProviderBase
. 所以我认为使用提供的版本可以解决问题(可能存在意外实现差异的副作用,但仍然如此) .
问题是,如果我取消注释POM中的注释依赖项,事实上使用Wildlfy中提供的 com.fasterxml.jackson.jaxrs:jackson-jaxrs-base
版本,它会在运行时再次抱怨:
引起:java.lang.ClassNotFoundException:来自[Module“deployment.myapp-ear-0.1-SNAPSHOT.ear.myapp-core-0.1-SNAPSHOT.jar:main”的com.fasterxml.jackson.jaxrs.base.ProviderBase服务模块加载器]
这似乎是一个冲突的类加载器的问题 . What am I missing and how can I solve this?