- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了类似的问题,但没有一个答案对我有帮助。
所以,我有 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/
我发现了类似的问题,但没有一个答案对我有帮助。 所以,我有 2 个具有反向指针关系的对象。家长: @XmlRootElement public class A { private B b;
我正在使用 MOXy JAXB 实现并广泛使用 @XmlInverseReference 注释。但是,我最近遇到了这种方法似乎不起作用的情况。如果我有一个类包含一个字段,该字段具有与父类类型相同的属性
我正在关注 http://blog.bdoughan.com/2010/08/creating-restful-web-service-part-35.html 上的教程。我将文件复制并粘贴到 net
我正在使用 Hibernate 和 RESTeasy,我尽量避免与这些实体形成循环,因为我在 Artiste 和 Oeuvre 实体之间存在 OneToMany (ManyToOne) 双向关系: O
我是一名优秀的程序员,十分优秀!