2014-09-14 3 views
7

In Bezug auf diese Frage habe ich ausgecheckt Spring Data Rest Ambiguous Association Exception, aber konnte es nicht für mich arbeiten. Wie Sie in meinem Code unten sehen können, fügte ich @RestResource Annotation mit rel gleich einem anderen Wert hinzuSpring Data Rest: Erkannt mehrere Association Links mit der gleichen Beziehung Typ

ähnlich wie die oben gestellte Frage, POST-Anfragen arbeiten, aber GET-Anfragen Ausnahme über mehrere Assoziationsbeziehungen mit derselben Beziehung Typ werfen:

„schreiben kann nicht JSON: Erkannte mehrere Assoziationsbeziehungen mit gleichem Beziehungstyp ! Disambiguate association @ org.springframework.data.rest.core.annotation.RestResource (rel = createdBy, exportierte = true, Pfad =, [email protected]ription (Wert =)) @ javax.persistence.ManyToOne (optional = true, targetEntity = void, cascade = [], Fetch = EAGER) @ javax.persistence.JoinColumn (referencedColumnName = ASSIGNABLE_ID, nullable = false, einzigartig = false, name = CREATED_BY, aktualisierbare = true, Column =, [email protected] (name =, Wert = CONSTRAINT, foreignKeyDefinition =), Tabelle =, einfügbar = true) private com.ag.persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity.createdBei Verwendung von @RestResource! (über die Referenzkette: org.springframework.hateoas.PagedResources [\ "_ embedded \"] -> java.util.UnmodifiableMap [\ "persons \"] -> java.util.ArrayList [0]); verschachtelte Ausnahme ist com.fasterxml.jackson.databind.JsonMappingException: Mehrere Assoziationsverknüpfungen mit demselben Beziehungstyp erkannt! Vereinbaren Sie die Zuordnung @ org.springframework.data.rest.core.annotation.RestResource (rel = createdBy, exportierte = true, path =, [email protected]iption (Wert =)) @ javax.persistence.ManyToOne (optional = true, targetEntity = Leere, Kaskade = [], holen = EAGER) @ javax.persistence.JoinColumn (referencedColumnName = ASSIGNABLE_ID, nullable = false, einzigartig = false, name = CREATED_BY, aktualisierbar = true, columnDefinition =, [email protected] (name =, Wert = CONSTRAINT, foreignKeyDefinition =), Tabelle =, einfügbar = true) private com.ag.persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity.createdBy u sing @RestResource! (durch die Referenzkette: org.springframework.hateoas.PagedResources [\ "_ eingebettet \"] -> java.util.UnmodifiableMap [\ "Personen \"] -> java.util.ArrayList [0])“

der Fehler scheint in dieser Klasse zu geschehen.

@Entity 
@Table(name = "team") 
public class TeamEntity extends AssignableEntity { 
    private String name; 
    private LocalDateTime createdDate; 
    private LocalDateTime modifiedDate; 
    private Collection<MembershipEntity> memberships; 
    private PersonEntity createdBy; 
    private PersonEntity modifiedBy; 

    @Basic 
    @Column(name = "NAME") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Basic 
    @Column(name = "CREATED_DATE") 
    public LocalDateTime getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(LocalDateTime createdDate) { 
     this.createdDate = createdDate; 
    } 

    @Basic 
    @Column(name = "MODIFIED_DATE") 
    public LocalDateTime getModifiedDate() { 
     return modifiedDate; 
    } 

    public void setModifiedDate(LocalDateTime modifiedDate) { 
     this.modifiedDate = modifiedDate; 
    } 

    @OneToMany(mappedBy = "team") 
    public Collection<MembershipEntity> getMemberships() { 
     return memberships; 
    } 

    public void setMemberships(Collection<MembershipEntity> memberships) { 
     this.memberships = memberships; 
    } 

    @RestResource(rel = "team_createdBy") 
    @ManyToOne 
    @JoinColumn(name = "CREATED_BY", referencedColumnName = "ASSIGNABLE_ID", nullable = false) 
    public PersonEntity getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(PersonEntity createdBy) { 
     this.createdBy = createdBy; 
    } 

    @RestResource(rel = "team_modifiedBy") 
    @ManyToOne 
    @JoinColumn(name = "MODIFIED_BY", referencedColumnName = "ASSIGNABLE_ID", nullable = false) 
    public PersonEntity getModifiedBy() { 
     return modifiedBy; 
    } 

    public void setModifiedBy(PersonEntity modifiedBy) { 
     this.modifiedBy = modifiedBy; 
    } 
} 

Ironischerweise ich nicht diese bestimmte Ressource bin Zugriff ich habe auch andere Ressourcen mit createdBy und modifiedBy - ist es das man dieses Problem verursacht

?
+0

Hat eine andere Entität die Eigenschaft 'createdBy'? Die 'PersonEntity' zum Beispiel? – zeroflagL

+0

Alle meine Entitäten haben die vier Felder: '' createdBy'', '' modifiedBy'', 'createdDate'' und' 'modifiedDate'' – Chad

+0

Das könnte das Problem sein. Werfen Sie einen Blick auf [diese Frage] (http://stackoverflow.com/questions/24426644/spring-data-rest-detected-multiple-association-links-with-same-relation-type). Bei beiden 'PersonEntitys' in Ihrer' TeamEntity' wird wahrscheinlich ein Link 'createdBy' angezeigt. – zeroflagL

Antwort

2

Ich vermute, dass Sie möglicherweisehabenauf Ihrem PersonEntity Objekt. Aus diesem Grund werden alle Referenzen in PersonEntity zum _links Abschnitt Ihrer TeamEntity hinzugefügt. Da beide PersonEntity Objekte eine createdBy Referenz haben, kollidieren sie mit der TeamEntity.createdBy Referenz.

Um zu verstehen, was dieses Beispiel geschieht helfen könnten:

class Answer { 
    Question q; //JPA ManyToOne back-reference 
} 

class Question { 
    List<Answer> as; // JPA OneToMany reference 
} 

class UserAnswer { 
    Answer a; 
    Question q; 
} 

In meinem Fall, weil ein Answer nur innerhalb eines Question existieren können, haben wir die folgenden auf unserer AnswerResource, zu verhindern, dass Antworten von einem Ausfuhr:

@RestResource(exported = false) 

Dies verursacht Answer Objekte innerhalb des übergeordneten Objekts serialisiert werden, und nicht als eine Referenz in dem _links Abschnitt, und das endet wobei die Ursache des Problems up ....

Wenn UserAnswer serialisiert wird, macht es so etwas wie dieses:

{ 
    "answer" : { 
    "creationDate" : "2014-09-18T17:28:31.000+0000", 
    "modificationDate" : "2014-09-18T17:28:31.000+0000", 
    "answerText" : "Vendas", 
    }, 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:9090/data/userAnswers/15" 
    }, 
    "question" : { 
     "href" : "http://localhost:9090/data/userAnswers/15/question" 
    } 
    } 
} 

Beachten Sie, dass „_links.question“ oben vom Answer ist!

Wenn Sie also ein Question zu UserAnswer hinzufügen, werden Sie den Fehler sehen Sie fragen, weil die UserAnswer selbst auch will eine Question einen _link Hinweis enthalten.

In Ihrem Fall denke ich, dass Ihre PersonEntity und Ihre TeamEntity beide createdBy Referenzen haben.

Ich bin nicht 100% sicher, was die Lösung ist noch, ich weiß nicht, ob Sie hierarchische rel Namen angeben können.

+1

Ich habe ein JIRA-Problem für diese erstellt, da ich vermute, es ist ein Fehler: https: //jira.spring .io/Durchsuchen/DATAREST-520 –

0

Kurze Antwort: Fügen Sie Spring Data-Repositories für ALLE (oder mindestens mehrere) Ihrer Entitäten hinzu. (In diesem Fall klingt es so, als müssten Sie ein PersonRepository erstellen).

Lange Antwort:

Spring Data Erholung nutzt _links den gesamten JSON Baum zurückschicken zu vermeiden, aber es kann nur _links gemappt Entitäten, die Repositorys haben machen.

Wenn es kein Repository für eine Entität gibt, kann Spring keine Verknüpfung verwenden und stattdessen das gesamte JSON-Objekt in die Antwort einfügen.

Ich denke, was mit dieser Ausnahme passiert, ist, dass eine niedrigere, Second-Level-Beziehung in einen _link gesetzt wird, und mehr als einer von ihnen denselben Namen haben.

Ich bin nicht 100% sicher, dass ich alles verstehe, aber ich hatte die gleiche Ausnahme, wenn nur Repositories für ein paar Entitäten, und wenn ich ein Repository für jede einzelne Entität erstellt hatte, verschwand das Problem.

Verwandte Themen