2013-07-10 7 views
5

Ich habe diesen Fehler, kann mir jemand bitte helfen?Dies wird unendlich tiefe XML verursachen

javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - mit Ausnahme verknüpft: [com.sun.istack.internal.SAXException2: Ein Zyklus ist in dem Objektgraph detektiert. Dies verursacht unendlich tief XML: [email protected] -> [email protected] -> [email protected]] um com.sun.xml.internal .ws.message.jaxb.JAXBMessage.writePayloadTo (Unbekannt Quelle) bei com.sun.xml.internal.ws.message.AbstractMessageImpl.writeTo (Unbekannt Quelle) bei com.sun.xml.internal.ws.encoding .StreamSOAPCodec.encode (Unbekannt Quelle) bei com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode (Unbekannt Quelle) bei com.sun.xml.internal.ws.transport.http.HttpAdapter.encodePacket (Unbekannt Quelle) um com.sun.xml.internal.ws.transport.http.HttpAdapter.acce ss $ 100 (Unknown Quelle) bei com.sun.xml.internal.ws.transport.http.HttpAdapter $ HttpToolkit.handle (Unbekannt Quelle) bei com.sun.xml.internal.ws.transport.http.HttpAdapter .handle (Unbekannt Quelle) um com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange (Unbekannt Quelle) um com.sun.xml.internal.ws.transport.http.server .WSHttpHandler.handle (Unknown Source) bei com.sun.net.httpserver.Filter $ Chain.doFilter (Unknown Quelle) bei sun.net.httpserver.AuthFilter.doFilter (unbekannte Quelle) um com.sun.net. httpserver.Filter $ Chain.doFilter (Unbekannte Quelle) um sun.net.httpserver.ServerImpl $ Exchange $ LinkHandler.handle (Unbekannt Quelle) bei com.sun.net.httpserver.Filter $ Chain.doFilter (Unbekannt Quelle) bei sun.net.httpserver.ServerImpl $ Exchange.run (unbekannte Quelle) bei java.util.concurrent.ThreadPoolExecutor.runWorker (Unknown Source) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (Unknown Source) bei java.lang.Thread.run (Unknown Source) verursacht durch: javax.xml.bind.MarshalException - mit Ausnahme verknüpft : [com.sun.istack.internal.SAXException2: Ein Zyklus wird im Objektdiagramm erkannt. Dies verursacht unendlich tief XML: [email protected] -> [email protected] -> [email protected]] um com.sun.xml.internal .bind.v2.runtime.MarshallerImpl.write (Unbekannt Quelle) um com.sun.xml.internal.bind.v2.runtime.BridgeImpl.marshal (Unbekannt Source) bei com.sun.xml.internal.bind. api.Bridge.marshal (Unbekannt Quelle) ... 19 mehr verursacht von: com.sun.istack.internal.SAXException2: Ein Zyklus wird im Objektdiagramm erkannt. Dies wird unendlich Deep XML verursachen: [email protected] -> [email protected] -> [email protected] um com.sun.xml.internal. bind.v2.runtime.XMLSerializer.reportError (Unbekannt Quelle) um com.sun.xml.internal.bind.v2.runtime.XMLSerializer.pushObject (Unbekannt Quelle) um com.sun.xml.internal.bind. v2.runtime.XMLSerializer.childAsXsiType (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody (Unbekannt Quelle) bei com.sun.xml.internal.bind. v2.runtime.ClassBeanInfoImpl.serializeBody (Unbekannt Quelle) um com.sun.xml. internal.bind.v2.runtime.XMLSerializer.childAsXsiType (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property. ArrayElementProperty.serializeListBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime. ClassBeanInfoImpl.serializeBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property. ArrayElementNodeProperty.serializeItem (UnbekanntQuelle) bei com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (Unbekannt Quelle) bei com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType (Unbekannt Source) ... 22 weitere

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-Hauptklasse

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"); 
    } 
+0

Vergiss meinen Kommentar. Es ist ein JAXB-Fehler, nicht Ruhezustand. Es sieht so aus, als würde der '@ XmlTransient' nicht in den Vordergrund treten ... – acdcjunior

+0

http://stackoverflow.com/questions/3073364/jaxb-mapping-cyclic-references-to-xml Die Zuordnung von Viele-zu-Viele-Beziehungen in XML kann dazu führen Endlos-XML-Erzeugungsschleife, da die Viele-zu-Viele-Elemente zueinander hin und her zeigen können. –

+0

Wie löse ich es bitte? Die Lösung in diesem Link funktioniert nicht, ich habe versucht, die XmlTransient Annotation durch die XmlInverse zu ersetzen ... aber es funktioniert nicht ... Bitte irgendwelche Vorschläge? – Gentuzos

Antwort

4

standardmäßig ein JAXB impl werden öffentliche Eigenschaften behandeln (get/set) Methodenpaare wie abgebildet. Wenn Sie das Feld kommentieren möchten, müssen Sie @XmlAccessorType(XmlAccessType.FIELD) auf Ihre Klasse setzen.

Wenn Sie Eclipse JAXB (moxy) als JAXB (JSR-222) Anbieter verwenden (Ich bin der moxy) das Sie führen dann die @XmlInverseReference Erweiterung verwenden können.

+0

Eigentlich habe ich das nicht verstanden. Ich benutze MOXy nicht. Kannst du mir mehr erklären, wie repariere ich dieses Problem bitte? – Gentuzos

+0

@Gentuzos - Haben Sie das Hinzufügen der '@XmlAccessorType (XmlAccessType.FIELD)' zu Ihrer Klasse oder '@ XmlTransient' vom Spielfeld auf die get-Methode zu verschieben? –

+0

Als ich die erste Annotation und die XmlTransient eine auf nur List für die Compte-Klasse hinzufügen, bekam ich „javax.xml.ws.soap.SOAPFaultException: java.lang.NullPointerException“ als Ausnahme. Und wenn ich die XmlTransient auf Compte-Klasse hinzufügen, bevor die Getter und löschen andere XmlTransient und XmlAccessorType Anmerkung habe ich den gleichen Fehler. PS: ich meine Post gerade aktualisiert haben, die WebMethod setzen und die Hauptklasse-Client. – Gentuzos

1

Bewegen Sie den @XmlTransient auf die get-Methode der Klasse, die die mappedBy Option (die Kehrseite der Beziehung) verwendet.

+0

können Sie ein Beispiel dafür hinzufügen – user18896654353

Verwandte Themen