Domanda JAXB Mappatura di riferimenti ciclici in XML


Ho un oggetto grafico che contiene un ciclo. Come faccio a ottenere JAXB per gestire questo? Ho provato ad usare il @XmlTransient annotazione nella classe figlio ma il marshaller JAXB rileva ancora il ciclo.

@Entity
@XmlRootElement
public class Contact {

    @Id
    private Long contactId;

    @OneToMany(mappedBy = "contact")
    private List<ContactAddress> addresses;

...

}

@Entity
@XmlRootElement
public class ContactAddress {

    @Id
    private Long contactAddressId;

    @ManyToOne
    @JoinColumn(name = "contact_id")
    private Contact contact;

    private String address;

...

}

18
2018-06-18 22:07


origine


risposte:


L'aspetto positivo dell'utilizzo di JAXB è che si tratta di un runtime standard con più implementazioni (proprio come JPA).

Se si utilizza EclipseLink JAXB (MOXy), sono disponibili molte estensioni per la gestione delle entità JPA incluse le relazioni bidirezionali. Questo viene fatto usando l'annotazione MOXy @XmlInverseReference. Agisce in modo simile a @XmlTransient sul maresciallo e popola la relazione target-to-source su unmarshal.

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA/Relationships

@Entity 
@XmlRootElement 
public class Contact { 

    @Id 
    private Long contactId; 

    @OneToMany(mappedBy = "contact") 
    private List<ContactAddress> addresses; 

... 

} 

@Entity 
@XmlRootElement 
public class ContactAddress { 

    @Id 
    private Long contactAddressId; 

    @ManyToOne 
    @JoinColumn(name = "contact_id") 
    @XmlInverseReference(mappedBy="addresses")
    private Contact contact; 

    private String address; 

... 

} 

Sono disponibili altre estensioni, incluso il supporto per chiavi composite e classi chiave incorporate.

Per specificare l'implementazione di EcliseLink MOXy JAXB è necessario includere un file jaxb.properties nelle classi del modello (ad esempio, Contratto) con la seguente voce:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

12
2017-07-05 16:45



Questa pagina nella "Guida non ufficiale di JAXB" offre tre strategie per gestire i cicli. Sono (in breve):

  • Contrassegnare uno degli attributi di riferimento che formano il ciclo come @XmlTransient.
  • Utilizzare @XmlID e @XmlIDREF in modo che i riferimenti vengano rappresentati utilizzando gli ID XML anziché dal contenimento.
  • Utilizzare l'interfaccia Cycle Rececable per gestire i cicli a livello di programmazione.

17
2018-06-19 01:57



XMLTransient funziona quasi sempre per cicli. Potrebbe essere una possibilità che tu abbia XMLTransient a livello di campo ma non hai specificato XMLAccessorType come XmlAccessType.Field. Se non si specifica nulla, il valore predefinito è XmlAccessType.Property o i getter. Ho sperimentato Jaxb che preleva elementi xml da getter di una classe a cui ho perso le annotazioni di tipo accessor e che funzionano perfettamente.


6
2017-11-01 18:26



basta guardare questo tutorial: Mappatura di riferimenti ciclici in XML di jaxb

Lo uso e funziona bene :)


1
2017-08-23 11:45



Possiamo usare XStream anche la libreria, ho provato un progetto in cui JAXB stava dando un errore ciclico, ma XStream lo gestiva con successo


1
2018-03-19 07:08