我有一个包含循环的对象图。如何让JAXB处理这个问题?我尝试在子类中使用@XmlTransient
注释,但是JAXB marshaller仍然检测到这个循环。
@Entity
@XmlRootElement
public class Contact {
@Id
private Long contactId;
@OneToMany(mappedBy = "contact")
private List<ContactAddress> addresses;
...
}
@Entity
@XmlRootElement
public class ContactAddress {
@Id
private Long contactAddressId;
@ManyToOne
@JoinColumn(name = "contact_id")
private Contact contact;
private String address;
...
}
发布于 2010-07-06 00:45:45
使用JAXB的好处是它是一个具有多个实现的标准运行时(就像JPA一样)。
如果您使用JAXB (MOXy),那么您可以使用许多扩展来处理EclipseLink实体,包括双向关系。这是使用MOXy @XmlInverseReference注释完成的。它在编组上的行为类似于@XmlTransient,并在解组时填充目标到源的关系。
http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA/Relationships
@Entity
@XmlRootElement
public class Contact {
@Id
private Long contactId;
@OneToMany(mappedBy = "contact")
private List<ContactAddress> addresses;
...
}
@Entity
@XmlRootElement
public class ContactAddress {
@Id
private Long contactAddressId;
@ManyToOne
@JoinColumn(name = "contact_id")
@XmlInverseReference(mappedBy="addresses")
private Contact contact;
private String address;
...
}
还可以使用其他扩展,包括对组合键和嵌入式键类的支持。
要指定EcliseLink MOXy JAXB实现,您需要在模型类(即契约)中包含一个jaxb.properties文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
发布于 2011-11-02 02:26:54
XMLTransient几乎总是在循环中工作。可能的情况是,您在字段级别上具有XMLTransient,但尚未将XMLAccessorType指定为XmlAccessType.Field。如果您不指定任何内容,则缺省值为XmlAccessType.Property -或您的getters。我遇到过Jaxb从getter中挑选xml元素的经验,因为我错过了访问器类型注释,但仍然可以很好地工作。
发布于 2010-08-23 19:45:30
看看这个教程:Mapping cyclic references to XML by jaxb
我使用它,它工作得很好:)
https://stackoverflow.com/questions/3073364
复制相似问题