0

このエラーが発生しています

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.

これらは2つのクラスです(少なくとも重要な部分)

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>();

投票.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、マーシャリングすべきではないので、このエラーは発生しないはずです。これらのタイプの関係に使用する必要がある別の注釈はありますか?

4

1 に答える 1

0

そのため、数日間の調査の後、なぜそれが機能しないのかがようやくわかりました。これまでに修正されたものではないように見えるため、Jax-rs でこの周期的なエラーが発生しています。を追加@XmlTransientしても、私の場合は1対多のように、エンティティの関係が考慮されているようです。これは Jboss にも当てはまります。これが Glassfish がデフォルトで修正できたものであるかどうかはよくわかりません。それを回避しようとするいくつかのチュートリアルがあります。私は個人的にそれらが不格好だと思ったので、Jersey によって xml に変換されるだけの別のクラス (POJO) を作成しました。これは機能しますが、これが問題でさえあることに少し驚いています。

うまくいけば、修正できない単なるバグであるため、彼らが何を間違えたのかを理解しようとするときに、何人かの人々の時間を節約できます. あなたができる最善の方法は、Web 上の回避策を使用するか、この目的のために別のクラスを作成することです。

于 2013-05-25T21:51:26.633 に答える