json - @XmlInverseReference 注释不起作用

标签 json jaxb eclipselink moxy

我发现了类似的问题,但没有一个答案对我有帮助。

所以,我有 2 个具有反向指针关系的对象。 家长:

@XmlRootElement
public class A {

    private B b;

    @XmlElement(name = "Element B")
    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

}

和乙:

@XmlRootElement
public class B {

    private A a;

    @XmlInverseReference(mappedBy = "b")
    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }

}

我已将 jaxb.properties 与模型放在同一个包中。 (javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory)

在这个片段之后:

A a = new A();
a.setB(new B());
a.getB().setA(a);

a”的 Json 表示是循环的“见下文”:

{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{"Element B":{"a":{".........

并且堆栈跟踪也是循环的:

at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245)

我怀疑我没有正确地将 MOXy 扩展添加到我的项目中...(刚刚添加到项目 eclipselink.jar 中)

最佳答案

以下应该有所帮助:

演示代码

您的映射是正确的。您可以使用以下演示代码验证这一点。

package forum14031963;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class}, properties);

        A a = new A();
        a.setB(new B());
        a.getB().setA(a);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(a, System.out);
    }

}

输出

下面是运行演示代码的输出。

{
   "Element B" : {
   }
}

Java 模型

在您的示例中,@XmlRootElement 注释不是必需的,我已将其删除。如果有演示代码,它们也将以相同的方式工作。

一个

package forum14031963;

import javax.xml.bind.annotation.XmlElement;

public class A {

    private B b;

    @XmlElement(name = "Element B")
    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

}

B

package forum14031963;

import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

public class B {

    private A a;

    @XmlInverseReference(mappedBy = "b")
    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }

}

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

JAX-RS

如果您使用的是 JAX-RS,则在您当前的配置中,Jackson 将被选为 JSON 提供者。将 MOXy 作为 JSON 提供程序的最简单方法是使用 MOXyJsonProvider 类。

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

了解更多信息

关于json - @XmlInverseReference 注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031963/

相关文章:

ios - 无法将类型 '__NSSingleObjectArrayI' 的值转换为 'NSDictionary'

java - 如何将 java JAXB Schema 类导出到 xsd 文件?

java - Weblogic + JPA不刷新Oracle数据库上的数据

java - 插入、更新和删除语句的报告是 JPA 标准,还是仅 Hibernate 特定的?

java - JPA [Eclipselink] - 如何刷新创建的动态实体的元数据?

javascript - 即使使用闭包也无法将数据传递给 getJSON

javascript - JavaScript 中的全局变量问题

java - 如何将树路径转换为 ​​json 对象

json - Xml 序列化 JAXB vs Jackson-dataformat-xml?

javax.xml.bind.UnmarshalException : XML document structures must start and end within the same entity