jboss - Wildfly 中的 JSON 序列化循环(无限递归)

标签 jboss jackson jax-rs resteasy wildfly

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

新版本的 Jackson 能够通过特殊注释来处理这种情况。为了使其正常工作,我需要排除 Wildfly 的内置 JSON 序列化器/ jackson 提供程序/无论它是什么,并使用与我的应用程序捆绑在一起的较新版本。我按照在网上找到的说明进行操作,并提出了这个 jboss-deployment-struct.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 中包含带有 ClassNotFoundException 的 jackson 库,部署就会失败。但是,我仍然遇到 org.codehaus.X (Jackson 1) 的无限递归错误。

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

最佳答案

解决方案是创建一个实现 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 特定的描述符。

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

该解决方案将 Jackson 2 投入使用。现在您可以使用 @JsonIdentityInfo 轻松避免序列化循环注解。 More info here .

关于jboss - Wildfly 中的 JSON 序列化循环(无限递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395380/

相关文章:

java - 从 JBOSS EJB 服务中调用 Web 服务时出现问题

postgresql - 在 JBoss 中使用连接池时 postgres 查询超时问题

java - 在本地 JBoss 服务器上调试时看不到源代码

java - 如何配置 jackson 以将 Enum 转换为 JSON?

java - 如何使用 JAX-RS 标准客户端 API 处理来自 Web 服务的错​​误 JSON 内容类型?

java - WebLogic 12c 中的 Resteasy(或不是 Jersey - JAX RS 实现)可能吗?

jboss - 如何在 JBoss AS 5 和 6 中创建自己的服务器配置文件

java - 使用单个 JsonView 过滤应用程序的每个 JAX-RS 资源

java - 如何使用 Jackson JSON 将 JSON 字符串转换为 Map<String, Set<String>>

Jersey POST 请求并关闭 InputStream