我正在使用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 回答
解决方案是使用Jackson的
ObjectMapper
创建一个实现MessageBodyWriter<Object>
的类:不需要任何排除或Wildfly特定的描述符 .
如果你包含依赖关系(
compile
或provided
范围都可以正常工作)并不重要,因为Wild 2中包含了Jackson 2 . 然而,由于一个未知的原因,几乎不可能停用 Jackson 1 .这个解决方案带来了Jackson 2的作品 . 现在,您可以使用
@JsonIdentityInfo
注释轻松避免序列化循环 . More info here .