我正在 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 特定的描述符。
是否包含依赖项并不重要( compile
或 provided
范围都可以正常工作),因为 Jackson 2 已包含在 Wildfly 中。然而,由于未知的原因,停用 Jackson 1 几乎是不可能的。
该解决方案将 Jackson 2 投入使用。现在您可以使用 @JsonIdentityInfo
轻松避免序列化循环注解。 More info here .
关于jboss - Wildfly 中的 JSON 序列化循环(无限递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395380/