JAX RS - JSON和XML循环/循环引用错误

Stu*_*rty 6 xml json jax-rs resteasy jboss7.x

我正在使用JAX RS使用通常的方法创建REST Web服务@Path, @GET, @Produces({"application/json, "application/xml"}).

我正在返回一个POJO作为响应,它根据请求的类型以JSON或XML的形式发送.它工作得很好,直到我添加了与另一个实体的多对多关系.这种关系是双向的.

我正在使用JBoss AS 7.我添加了杰克逊@JsonManagedReference,@JsonBackReference但无济于事.

怎么克服这个?

我像这样部署了我的JAX RS: -

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>    
Run Code Online (Sandbox Code Playgroud)

我没有扩展任何Application类或使用任何JAXRS激活器类.

这个JBoss的RESTEasy使用Jackson作为他们的JSON提供者,甚至为什么它不能识别@JsonManagedReference注释?

我是否必须更新依赖项,如果是,那么如何?如果请求是XML的,如何修复它,它在JAXB中的循环引用中也失败了.

提前致谢!

bdo*_*han 5

注意: 我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB(JSR-222)专家组的成员。

MOXy提供了@XmlInverseReference可用于支持XML和JSON绑定中的双向关系的扩展。


JAVA模型

顾客

CustomerPhoneNumber对象的集合。

package forum12312395;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Customer {

    private List<PhoneNumber> phoneNumbers;

    @XmlElement(name="phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

}
Run Code Online (Sandbox Code Playgroud)

电话号码

每个PhoneNumber对象都维护一个指向该Customer对象的后向指针。该属性带有注释@XmlInverseReference

package forum12312395;

import javax.xml.bind.annotation.XmlValue;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

public class PhoneNumber {

    private String value;
    private Customer customer;

    @XmlValue
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @XmlInverseReference(mappedBy="phoneNumbers")
    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

}
Run Code Online (Sandbox Code Playgroud)

jaxb.properties

要将MOXy用作JAXB提供程序,您需要jaxb.properties在与域模型相同的程序包中包含一个名为的文件,并包含以下条目(请参阅:http : //blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -your.html):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

输入

以下是在此示例中将解组的文档

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <phone-number>555-WORK</phone-number>
    <phone-number>555-HOME</phone-number>
</customer>
Run Code Online (Sandbox Code Playgroud)

input.json

{
    "customer" : {
        "phone-number" : ["555-HOME", "555-WORK"]
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

输出值

以下是运行演示代码的输出。如您所见,该customer属性填充在所有PhoneNumber对象上。

forum12312395.Customer@3ef38fd1
forum12312395.Customer@3ef38fd1
forum12312395.Customer@320eef20
forum12312395.Customer@320eef20
Run Code Online (Sandbox Code Playgroud)

想要查询更多的信息