首页 文章

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

提问于
浏览
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>

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

提前致谢 .

更新

我更改了 Headers ,因为我猜问题更大了 . 要么我做了一些非常错误的事情,要么Wildfly存在严重问题 .

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

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

1 回答

  • 2

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

    @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 范围都可以正常工作)并不重要,因为Wild 2中包含了Jackson 2 . 然而,由于一个未知的原因,几乎不可能停用 Jackson 1 .

    这个解决方案带来了Jackson 2的作品 . 现在,您可以使用 @JsonIdentityInfo 注释轻松避免序列化循环 . More info here .

相关问题