Джексон 2 на Wildfly 10: Как загрузить ProviderBase?

Кажется, есть много вопросов, связанных с 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" из службы Загрузчик модулей]

Кажется, это проблема конфликтующих загрузчиков классов. Что мне не хватает и как это решить?


person Silver Quettier    schedule 13.07.2016    source источник
comment
Ваш провайдер Джексона также должен быть provided, так как вы используете предоставленный контейнер   -  person Paul Samsotha    schedule 14.07.2016
comment
@peeskillet У меня сложилось впечатление, что Wildfly 10 использует Jackson 1.9.x, а не 2.x? Установка провайдера на <scope>provided</scope> дает тот же ClassNotFoundException.   -  person Silver Quettier    schedule 18.07.2016
comment
Нет, по умолчанию 2.x   -  person Paul Samsotha    schedule 18.07.2016
comment
Мог ли я тогда что-то еще упустить? Это все еще не работает. Я могу предоставить дополнительную информацию, если вам это нужно.   -  person Silver Quettier    schedule 19.07.2016