提问者:小点点

JAXRS-JSON和XML圆形/循环引用错误


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

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

我正在使用JBoss AS 7。我添加了Jackson的@JsonManagedApplication@JsonBackApplication,但无济于事。

如何克服这个?

我像这样部署了我的JAXRS:-

<?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>    

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

这个JBoss的RESTEasy使用Jackson作为他们的JSON提供者,即使这样,为什么它不识别@JsonManagedApplication注释?

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

提前感谢!


共1个答案

匿名用户

注意:我是Eclipse Link JAXB(MOXy)的负责人和JAXB(JSR-222)专家组的成员。

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

JAVA模型

客户

客户有一个PhoneNumber对象的集合。

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;
    }

}

电话号码

每个PhoneNumber对象都维护一个指向Client对象的反向指针。此属性使用@XmlInverseApplication进行注释。

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;
    }

}

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

输入

下面是我们将在此示例中散集的文档

input. xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <phone-number>555-WORK</phone-number>
    <phone-number>555-HOME</phone-number>
</customer>

Input. json

{
    "customer" : {
        "phone-number" : ["555-HOME", "555-WORK"]
    }
}

DEMO

package forum12312395;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
import org.eclipse.persistence.oxm.MediaType;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        // JSON
        Unmarshaller jsonUnmarshaller = jc.createUnmarshaller();
        jsonUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        StreamSource json = new StreamSource("src/forum12312395/input.json");
        Customer customerFromJSON = (Customer) jsonUnmarshaller.unmarshal(json);
        for(PhoneNumber phoneNumber : customerFromJSON.getPhoneNumbers()) {
            System.out.println(phoneNumber.getCustomer());
        }

        // XML
        Unmarshaller xmlUnmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource("src/forum12312395/input.xml");
        Customer customerFromXML = (Customer) xmlUnmarshaller.unmarshal(xml);
        for(PhoneNumber phoneNumber : customerFromXML.getPhoneNumbers()) {
            System.out.println(phoneNumber.getCustomer());
        }
    }

}

输出

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

forum12312395.Customer@3ef38fd1
forum12312395.Customer@3ef38fd1
forum12312395.Customer@320eef20
forum12312395.Customer@320eef20

了解更多信息

  • http://blog.bdoughan.com/2010/07/jpa-entities-to-xml-bidirectional.html
  • http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html
  • http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.html
  • http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html