Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何避免封送处理异常_Xml_Hibernate_Rest_Jakarta Ee - Fatal编程技术网

Xml 如何避免封送处理异常

Xml 如何避免封送处理异常,xml,hibernate,rest,jakarta-ee,Xml,Hibernate,Rest,Jakarta Ee,我得到了这个错误 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

我得到了这个错误

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.
这是两个类(至少是重要部分)

compleddvote.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>();
@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>();
@XmlRootElement(name=“复杂投票”)
@实体
@表(name=“复杂的投票”)
公共类complexDvote实现可序列化{
私有静态最终长serialVersionUID=1L;
@XmlElement(必需=true)
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”,nullable=false)
私有int-id;
@XmlElement(必需=true)
@列(name=“name”,nullable=false)
私有字符串名称;
@XmlTransient
@OneToMany(cascade={CascadeType.ALL},targetEntity=Vote.class,fetch=FetchType.EAGER)
@可接合(
name=“父\子”,
joinColumns=@JoinColumn(name=“PARENT_ID”),
inverseJoinColumns=@JoinColumn(name=“CHILD\u ID”)
)
private List children=new ArrayList();

Vote.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>();
@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>();
@XmlRootElement(name=“投票”)
@实体
@表(name=“投票”)
公共类投票实现可序列化{
私有静态最终长serialVersionUID=1L;
@XmlElement(必需=true)
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”,nullable=false)
私有int-id;
@XmlElement(必需=true)
@列(name=“name”,nullable=false)
私有字符串名称;
@XmlElement(必需=true)
@列(name=“max”,nullable=false)
私人int max;
@XmlElement(必需=true)
@列(name=“current”,nullable=false)
私有电流;
@XmlElement(必需=true)
@列(name=“is_simple”,nullable=false)
私密性不简单;
@XmlTransient
@ManyToOne(cascade={CascadeType.ALL},targetEntity=compleddvote.class,fetch=FetchType.EAGER)
私家侦探;
@XmlElement(必需=true)
@短暂的
沃顿私人酒店;
@XmlTransient
@ManyToMany(cascade={CascadeType.ALL},targetEntity=User.class,fetch=FetchType.EAGER)
@JoinTable(name=“用户投票”,
joinColumns={@JoinColumn(name=“VOTE_ID”)},
inverseJoinColumns={@JoinColumn(name=“USER\u ID”)}
)
私有集投票者=新HashSet();


现在我将其用于Jax-RS。因此,问题只发生在尝试将其转换为xml时。逻辑本身都在工作。问题是我不知道如何避免出现异常,因为从技术上讲,逻辑没有错。或者可能是。希望有人能解释为什么会这样做以及如何避免。我还应该提到这一点t因为我使用的是
@xmltransive
,所以这个错误不应该发生,因为我想它不应该对它进行封送处理。那么,对于这些类型的关系,我必须使用不同的注释吗?

所以经过几天的研究,我终于明白了为什么它不起作用。我在Jax rs中得到这个周期性错误,因为它似乎从来没有被修复过。即使在添加
@xmltransive
时,它似乎仍然考虑到实体关系,就像我的例子中的一对多。Jboss也是如此。我不太确定Glassfish是否能够默认修复这一问题。有一些教程试图我个人认为它们很笨重,因此我创建了一个单独的类(POJO),该类的存在只是为了由Jersey转换为xml。它是有效的,尽管我有点惊讶这甚至是一个问题

希望我能节省一些人的时间来找出他们做错了什么,因为这只是一个无法修复的bug。最好的办法是使用web上的解决方法,或者为此创建一个单独的类