似乎有很多与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?