Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

This will cause infinitely deep XML

I got this error, can someone help me please?

javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: tn.bh.jpa.Compte@1144c75 -> tn.bh.jpa.Mouvement_Compte@1f4eccd -> tn.bh.jpa.Compte@1144c75] at com.sun.xml.internal.ws.message.jaxb.JAXBMessage.writePayloadTo(Unknown Source) at com.sun.xml.internal.ws.message.AbstractMessageImpl.writeTo(Unknown Source) at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(Unknown Source) at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(Unknown Source) at com.sun.xml.internal.ws.transport.http.HttpAdapter.encodePacket(Unknown Source) at com.sun.xml.internal.ws.transport.http.HttpAdapter.access$100(Unknown Source) at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(Unknown Source) at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(Unknown Source) at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(Unknown Source) at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(Unknown Source) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.AuthFilter.doFilter(Unknown Source) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: tn.bh.jpa.Compte@1144c75 -> tn.bh.jpa.Mouvement_Compte@1f4eccd -> tn.bh.jpa.Compte@1144c75] at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.marshal(Unknown Source) at com.sun.xml.internal.bind.api.Bridge.marshal(Unknown Source) ... 19 more Caused by: com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: tn.bh.jpa.Compte@1144c75 -> tn.bh.jpa.Mouvement_Compte@1f4eccd -> tn.bh.jpa.Compte@1144c75 at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.pushObject(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(Unknown Source) ... 22 more

tn.bh.jpa.Compte

@Entity
@Table(name="compte")
public class Compte {
    @Id
    @Column(name="compte_rib")
    private Integer rib;

    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="compte_utilisateurIdentifiant")
    @XmlTransient
    private User user;

    @Column(name="compte_libelle")
    private String libelle;

    @OneToMany(mappedBy="compte")
    private List<Solde> soldeList;

    @Column(name="compte_dateCreation", nullable=false)
    private String dateCréation;
    @Column(name="compte_dateMaj", nullable=false)
    private String dateMaj;
    @Column(name="compte_typeDevise", nullable=false)
    private Integer typeDevise;
    @Column(name="compte_situationCompte", nullable=false)
    private Integer situationCompte;

    @OneToMany(fetch = FetchType.EAGER, mappedBy="compte2")
    @XmlTransient
    private List<Mouvement_Compte> mvtList;

    @ManyToMany(cascade = {CascadeType.ALL},
            mappedBy = "comptes",
            targetEntity = Virement.class)
    private List<Virement> virementList;

    public Compte(){}

    public Compte(Integer rib, String libelle, String dateCréation, String dateMaj,
            Integer typeDevise, Integer situationCompte) {
        this.rib = rib;
        this.libelle = libelle;
        this.dateCréation = dateCréation;
        this.dateMaj = dateMaj;
        this.typeDevise = typeDevise;
        this.situationCompte = situationCompte;
    }



    public boolean equals(Compte c){
        boolean returnValue = true;
        if ((!this.rib.equals(c.getRib()))
                || (!this.dateCréation.equals(c.getDateCréation()))
                || (!this.dateMaj.equals(c.getDateMaj()))
                || (!this.typeDevise.equals(c.getTypeDevise()))
                || (!this.situationCompte.equals(c.getSituationCompte())))

            returnValue = false;

        return returnValue; 
    }

    public String toString(Compte c){
        return "[Rib] : " + c.getRib() + " [Libelle] : " + c.getLibelle() + " [String création] : " + 
                c.getDateCréation() + " [String mise-à-jour] : " + c.getDateMaj() + " [Type devise] : " + 
                c.getTypeDevise() + " [Situation compte] : " + c.getSituationCompte();
    }

    public Integer getRib() {
        return rib;
    }

    public void setRib(Integer rib) {
        this.rib = rib;
    }

    public String getLibelle() {
        return libelle;
    }

    public void setLibelle(String libelle) {
        this.libelle = libelle;
    }

    public String getDateCréation() {
        return dateCréation;
    }

    public void setDateCréation(String dateCréation) {
        this.dateCréation = dateCréation;
    }

    public String getDateMaj() {
        return dateMaj;
    }

    public void setDateMaj(String dateMaj) {
        this.dateMaj = dateMaj;
    }

    public Integer getTypeDevise() {
        return typeDevise;
    }

    public void setTypeDevise(Integer typeDevise) {
        this.typeDevise = typeDevise;
    }

    public Integer getSituationCompte() {
        return situationCompte;
    }

    public void setSituationCompte(Integer situationCompte) {
        this.situationCompte = situationCompte;
    }

    public List<Solde> getSoldeList() {
        return soldeList;
    }

    public void setSoldeList(List<Solde> soldeList) {
        this.soldeList = soldeList;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Mouvement_Compte> getMvtList() {
        return mvtList;
    }

    public void setMvtList(List<Mouvement_Compte> mvtList) {
        this.mvtList = mvtList;
    }

    public List<Virement> getVirementList() {
        return virementList;
    }

    public void setVirementList(List<Virement> virementList) {
        this.virementList = virementList;
    }


}

tn.bh.jpa.Mouvement_compte

@Entity
@Table(name="mouvement_compte")
public class Mouvement_Compte {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="mouvement_compte_id")
    private Integer id;

    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="mouvement_compte_compteRib")
    @XmlTransient
    private Compte compte2;

    @Column(name="mouvement_compte_cod_op", nullable=false)
    private String cod_op;
    @Column(name="mouvement_compte_dat_mvt", nullable=false)
    private String dat_mvt;
    @Column(name="mouvement_compte_mnt_mvt", nullable=false)
    private Double mnt_mvt;
    @Column(name="mouvement_compte_sens_mvt", nullable=false)
    private char sens_mvt;
    @Column(name="mouvement_compte_dat_journee", nullable=false)
    private String dat_journee;

    public Mouvement_Compte(){}

    public Mouvement_Compte(String cod_op, String dat_mvt,
            Double mnt_mvt, char sens_mvt, String dat_journee) {
        this.cod_op = cod_op;
        this.dat_mvt = dat_mvt;
        this.mnt_mvt = mnt_mvt;
        this.sens_mvt = sens_mvt;
        this.dat_journee = dat_journee;
    }

    public boolean equals(Mouvement_Compte m){
        boolean returnValue = true;
        if ((!this.id.equals(m.getId()))
                || (!this.cod_op.equals(m.getCod_op()))
                || (!this.dat_mvt.equals(m.getDat_mvt()))
                || (!this.mnt_mvt.equals(m.getMnt_mvt()))
                || ((this.sens_mvt != m.getSens_mvt()))
                || (!this.dat_journee.equals(m.getDat_journee())))

            returnValue = false;

        return returnValue; 
    }

    public String toString(Mouvement_Compte m){
        return "[Id] : " + m.getCod_op() + " [Code opération] : " + m.getCod_op() +
                " [Date] : " + m.getDat_mvt() + " [Montant] : " + m.getMnt_mvt() +
                " [Sens] : " + m.getSens_mvt() + " [String journée] : " + m.getDat_journee();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCod_op() {
        return cod_op;
    }

    public void setCod_op(String cod_op) {
        this.cod_op = cod_op;
    }

    public String getDat_mvt() {
        return dat_mvt;
    }

    public void setDat_mvt(String dat_mvt) {
        this.dat_mvt = dat_mvt;
    }

    public Double getMnt_mvt() {
        return mnt_mvt;
    }

    public void setMnt_mvt(Double mnt_mvt) {
        this.mnt_mvt = mnt_mvt;
    }

    public char getSens_mvt() {
        return sens_mvt;
    }

    public void setSens_mvt(char sens_mvt) {
        this.sens_mvt = sens_mvt;
    }

    public String getDat_journee() {
        return dat_journee;
    }

    public void setDat_journee(String dat_journee) {
        this.dat_journee = dat_journee;
    }

    public Compte getCompte() {
        return compte2;
    }

    public void setCompte(Compte compte) {
        this.compte2 = compte;
    }


}

WebMethod

@WebMethod
    public List<Compte> consulterListeCpt(String id){
            List<Compte> objects = null;
            try {
                    s = HibernateUtils.getSession();
                    Transaction tx = s.beginTransaction();
                    Query query = s.createQuery("from Compte where compte_utilisateuridentifiant = :y");
                    query.setString("y", id);
                    objects = query.list();
                    tx.commit();
            } catch (HibernateException e) {
                    System.out.println(e.getMessage());
            } finally {
                    s.close();
            }

            for (Compte c: objects)
                    System.out.println("[rib] = " + c.getRib() + "\t" +
                                    "[title] = " + c.getLibelle() + "\t" +
                                    "[dateC] = " + c.getDateCréation() + "\t");

            return objects;
    }

Client main class

    public class Client {
    public static void main(String[] args){
        ServiceService service = new ServiceService();
        tn.bh.services.client.Service srvc = service.getServicePort();
        List<Compte> response = srvc.consulterListeCpt("id");   
    }
like image 273
Gentuzos Avatar asked Jul 10 '13 17:07

Gentuzos


Video Answer


2 Answers

By default a JAXB impl will treat public properties (get/set) method pairs as mapped. If you want to annotate the field you need to put @XmlAccessorType( XmlAccessType.FIELD) on your class.

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html

If you are using EclipseLink JAXB (MOXy) as your JAXB (JSR-222) provider (I'm the MOXy) lead then you can use the @XmlInverseReference extension.

  • http://blog.bdoughan.com/2010/07/jpa-entities-to-xml-bidirectional.html
like image 85
bdoughan Avatar answered Oct 19 '22 20:10

bdoughan


Move the @XmlTransient to the get method of the class that uses the mappedBy option (the inverse side of the relation).

like image 1
Ritwick Ghosh Avatar answered Oct 19 '22 21:10

Ritwick Ghosh