我收到此错误
The server encountered an internal error (javax.xml.bind.MarshalException - with linked
exception: [com.sun.istack.SAXException2: A cycle is detected in the object graph. This
will cause infinitely deep XML: com.app.Vote@16cc0f7 ->
com.app.ComplicatedVote@1a961d2 -> com.app.Vote@16cc0f7]) that
prevented it from fulfilling this request.
这是两类(至少是重要的部分)
ComplicatedVote.java
@XmlRootElement(name="complicated-vote")
@Entity
@Table(name="complicated_votes")
public class ComplicatedVote implements Serializable{
private static final long serialVersionUID = 1L;
@XmlElement(required=true)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable=false)
private int id;
@XmlElement(required=true)
@Column(name="name", nullable=false)
private String name;
@XmlTransient
@OneToMany(cascade = {CascadeType.ALL}, targetEntity=Vote.class, fetch=FetchType.EAGER)
@JoinTable(
name="PARENT_CHILD",
joinColumns = @JoinColumn( name="PARENT_ID"),
inverseJoinColumns = @JoinColumn( name="CHILD_ID")
)
private List<Vote> children = new ArrayList<Vote>();
Vote.java
@XmlRootElement(name="vote")
@Entity
@Table(name="votes")
public class Vote implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(required=true)
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", nullable=false)
private int id;
@XmlElement(required=true)
@Column(name="name", nullable=false)
private String name;
@XmlElement(required=true)
@Column(name="max", nullable=false)
private int max;
@XmlElement(required=true)
@Column(name="current", nullable=false)
private int current;
@XmlElement(required=true)
@Column(name="is_simple", nullable=false)
private int isSimple;
@XmlTransient
@ManyToOne (cascade = {CascadeType.ALL}, targetEntity=ComplicatedVote.class, fetch=FetchType.EAGER)
private ComplicatedVote parent;
@XmlElement(required=true)
@Transient
private int votedOn;
@XmlTransient
@ManyToMany(cascade = {CascadeType.ALL}, targetEntity=User.class, fetch=FetchType.EAGER)
@JoinTable(name = "USER_VOTES",
joinColumns = {@JoinColumn(name = "VOTE_ID")},
inverseJoinColumns = {@JoinColumn(name = "USER_ID")}
)
private Set<User> voters = new HashSet<User>();
现在我正在使用Jax-RS。所以只有在尝试将其转换为xml时才会出现问题。逻辑本身都在发挥作用。问题是我不知道如何不引起该异常,因为从技术上讲,逻辑并没有错。或者也许是。希望有人可以阐明为什么会这样做以及如何避免它。我还应该提一下,因为我使用的是@XmlTransient
,所以不应该发生这个错误,因为我猜它不应该编组它。那么我必须使用不同的注释用于这些类型的关系吗?
答案 0 :(得分:0)
经过几天的研究,我终于找到了为什么它不起作用。我用Jax-rs得到了这个周期性的错误,因为它似乎并没有被修复过的东西。即使添加@XmlTransient
,它似乎仍然会考虑实体关系,就像我的情况中的一对多关系一样。嗯,这对Jboss来说也是如此。我不太确定Glassfish是否能够默认修复。有一些教程试图解决它。我个人认为它们很笨重,因此我只创建了一个单独的类(POJO),它只是由Jersey转换为xml。它有效,虽然我有点惊讶这甚至是一个问题。
希望在尝试弄清楚他们做错了什么时,我会节省一些时间,因为它只是一个无法修复的错误。您可以做的最好的事情就是在网络上使用工作,或者为此目的创建一个单独的类。