Кажется, есть много вопросов, связанных с Wildfly и Джексоном, но я не смог решить свою проблему, несмотря на поиск по всему сайту...
Я хочу использовать Jackson 2 для обработки сериализации JSON в приложении, развернутом на Wildfly 10, но я продолжаю застревать при загрузке класса 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$Proxy$_$$WeldClientProxy.disable(Lcom/fasterxml/jackson/databind/SerializationFeature;)Lcom /fasterxml/jackson/jaxrs/base/ProviderBase;" загрузчик класса (экземпляр org/jboss/modules/ModuleClassLoader) текущего класса, com/my/package/CustomJsonProvider$Proxy$$$_WeldClientProxy, и его загрузчик суперкласса (экземпляр org/jboss/modules/ ModuleClassLoader), имеют разные объекты класса для типа com/fasterxml/jackson/jaxrs/base/ProviderBase, используемого в подписи.
Насколько я понял, существует другая версия ProviderBase
, загруженная загрузчиком классов Wildfly. Поэтому я решил, что использование предоставленной версии решит проблему (с возможным побочным эффектом неожиданных различий в реализации, но все же).
Проблема в том, что если я раскомментирую закомментированную зависимость в POM, де-факто используя версию com.fasterxml.jackson.jaxrs:jackson-jaxrs-base
, предоставленную в Wildlfy, она снова жалуется во время выполнения:
Вызвано: java.lang.ClassNotFoundException: com.fasterxml.jackson.jaxrs.base.ProviderBase из [модуля "deployment.myapp-ear-0.1-SNAPSHOT.ear.myapp-core-0.1-SNAPSHOT.jar:main" из службы Загрузчик модулей]
Кажется, это проблема конфликтующих загрузчиков классов. Что мне не хватает и как это решить?
provided
, так как вы используете предоставленный контейнер - person Paul Samsotha   schedule 14.07.2016<scope>provided</scope>
дает тот жеClassNotFoundException
. - person Silver Quettier   schedule 18.07.2016