2

我正在 IntelliJ IDEA 中开发一个简单的基于 maven 的 JavaEE 应用程序,显然我想将 Wildfly 8 用于开发和生产。我只需要通过一些 RESTful Web 服务公开一些实体。这些实体具有双向关系,当它们将被序列化为 JSON 时会导致循环。

较新版本的 Jackson 能够通过特殊注释处理这种情况。为了让它工作,我需要排除 Wildfly 的内置 JSON 序列化程序/jackson 提供程序/无论它是什么,并使用与我的应用程序捆绑在一起的较新版本。我按照我在网上找到的说明,提出了这个 jboss-deployment-structure.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.codehaus.jackson.jackson-jaxrs" />
            <module name="org.codehaus.jackson.jackson-core-asl" />
            <module name="org.codehaus.jackson.jackson-mapper-asl" />
            <module name="org.codehaus.jackson.jackson-xc" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

问题是,它不起作用。即使我将 pom.xml 设置为如下所示:

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.3.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson2-provider</artifactId>
        <version>3.0.6.Final</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

这清楚地表明我的应用程序不应该捆绑任何东西,我仍然得到这个 StackOverflowError(由无限循环引起),它源于 org.codehaus.jackson 包。这又意味着 Jackson 的内置版本仍在开发中,不排除在外。我怎样才能解决这个问题?

提前致谢。

更新

我更改了标题,因为我想问题更大。要么我做错了什么,要么 Wildfly 存在严重问题。

我创建了一个带有“编译”范围的所有 jackson 2 库 (com.fasterxml.jackson*) 的 pom.xml。这些库包含在 WEB-INF/lib 文件夹中。我根据Jackson JAX-RS FAQ编写了一个 @Provider并且我可以验证它实际上是由 JAX-RS 实现 (RestEasy) 读取的,仅仅是因为如果我不在 WEB-INF/lib 中包含 jackson 库,部署将失败一个 ClassNotFoundException。但是,我仍然遇到 org.codehaus.X (Jackson 1) 的无限递归错误。

我不在乎如何,我只需要一个解决方案来修复 Wildfly 中的这种无限递归。

4

1 回答 1

2

解决方案是创建一个MessageBodyWriter<Object>使用 Jackson实现的类ObjectMapper

@Provider
@Produces("application/json")
public class JacksonMapper implements MessageBodyWriter<Object> {

    @Override
    public boolean isWriteable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
        return true;
    }

    @Override
    public long getSize(Object object, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
        return 0;
    }

    @Override
    public void writeTo(Object object, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> stringObjectMultivaluedMap, OutputStream outputStream)
            throws IOException, WebApplicationException {
        outputStream.write(new ObjectMapper().writeValueAsBytes(object));
    }

}

不需要任何排除或 Wildfly 特定的描述符。

由于 Jackson 2 包含在 Wildfly 中,因此是否包含依赖项(compile或范围都可以正常工作)并不重要。provided但是,由于未知原因,停用 Jackson 1 几乎是不可能的。

该解决方案将 Jackson 2 带入了工作中。@JsonIdentityInfo现在,您可以使用注释轻松避免序列化循环。更多信息在这里

于 2014-02-02T07:31:10.820 回答