Spring Data REST - Entdeckt mehrere assoziationsbeziehungen mit gleicher relation Typ
Ich versuche zu tun, eine einfache Feder-app. Es muss aussetzen REST-Endpunkte und speichern Sie es auf einer relationalen Datenbank.
Ich habe deine Beispiel-Projekt, http://spring.io/guides/gs/accessing-data-rest/. Ich bin in der Lage zu tun, alle Operationen( POST -, PATCH -, PUT, GET), wie erwähnt, in Ihrem Handbuch.
Aber ich versuchte, Sie erstellen hinzufügen von Beziehungen zu Person Entity-Klasse, und die Dinge beginnen zu zerfallen.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
@OneToOne(cascade = {CascadeType.ALL})
private PersonDetails personDetails;
@OneToOne(cascade = {CascadeType.ALL})
private PersonChildren personChildren;
///Getter and setters for everything except id.
}
@Entity
public class PersonChildren {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String childFirstName;
private String childLastName;
@OneToOne(mappedBy="personChildren", optional=false)
private Person person;
///Getter and setters for everything except id.
}
@Entity
public class PersonDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String email;
private String phoneNumber;
@OneToOne(mappedBy="personDetails",optional=false)
private Person person;
///Getter and setters for everything except id.
}
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
List<Person> findByLastName(@Param("name") String name);
}
build.gradle
buildscript {
repositories {
maven { url "http://repo.spring.io/libs-release" }
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.1.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar {
baseName = 'gs-accessing-data-rest'
version = '0.1.0'
}
repositories {
mavenLocal()
mavenCentral()
maven { url "http://repo.spring.io/libs-release" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("com.h2database:h2")
compile("org.springframework.data:spring-data-rest-webmvc")
}
task wrapper(type: Wrapper) {
gradleVersion = '1.11'
}
Nennen:
$ curl -i -X POST -H "Content-Type:application/json" -d '{ "firstName":"John", "lastName": "Doe", "personDetails": { "email": "[email protected]", "phoneNumber": "001-002-0003" }, "personChildren": {"childFirstName": "Mary", "childLastName": "Martin" } }' <code> http://localhost:8080/people </code>
Response:
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
<code>
Location: http://localhost:8080/people/1
</code>
Content-Length: 0
Date: Thu, 26 Jun 2014 05:42:45 GMT
$ curl http://localhost:8080/people
{
"timestamp" : 1403761371011,
"status" : 500,
"error" : "Internal Server Error",
"exception" : "org.springframework.http.converter.HttpMessageNotWritableException",
"message" : "Could not write JSON: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.OneToOne(optional=false, targetEntity=void, cascade=[], fetch=EAGER, orphanRemoval=false, mappedBy=personChildren) private com.ds.dao.rest.Person com.ds.dao.rest.PersonChildren.person using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]->java.util.UnmodifiableMap[\"people\"]->java.util.ArrayList[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.OneToOne(optional=false, targetEntity=void, cascade=[], fetch=EAGER, orphanRemoval=false, mappedBy=personChildren) private com.ds.dao.rest.Person com.ds.dao.rest.PersonChildren.person using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]->java.util.UnmodifiableMap[\"people\"]->java.util.ArrayList[0])",
"path" : "/people"
}
Frage 1: ich bin in der Lage zu tun, einen Beitrag, aber meine BEKOMMEN hält, zu scheitern.
Frage 2: Warum bin ich immer diese Fehlermeldung wenn Post erfolgreich ist?
Frage 3: gibt es ein gutes Spring-Guide, hilft mit RUHE und JPA? Wenn Sie arbeiten immer noch auf diese Module welche Beispiele kann ich schauen?
Frage 4: Ist @RepositoryRestResource das problem? Es ist nicht anerkannt, es sei denn ich füge spring-data-rest-webmvc als Abhängigkeit.
Dies ist ähnlich wie die Frage unbeantwortet
Spring Data Rest Mehrdeutig Verein Ausnahme
Update:
Es arbeitet mit nur einer OneToOne
mapping in Person
Klasse. Wenn ich beide Klassen, personDetails
und personChildren
im Person
mit OneToOne
mapping. Es ist NICHT in Ordnung.
Ich auch versucht, indem @JointColumn(name="person_details")
und @JointColumn(name="person_children")
zu personDetails
und personChildren
. Es hat NICHT funktioniert entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund dafür ist ziemlich einfach: der Bezug von Namen für die zugehörigen Einheiten sind abgeleitet von den Namen der Eigenschaft der übergeordneten Klasse. Also beide
PersonDetails
undPersonChildren
möchten, erstellen Sie eine ausgehende Verbindung zu einemPerson
namensperson
. Wenn wir gerendert hätte, wäre es in etwa so AussehenDies ist natürlich ungültig. Auch die Schlange, die zwei links in einem array nicht erlauben würde, Sie zu unterscheiden zwischen den beiden links nicht mehr (das kommt von
PersonDetails
- und die kommt ausPersonChildren
.Also es gibt ein paar Optionen hier:
Person
Eigenschaften mit@RestResource
und konfigurieren Sie dierel
Attribut der annotation, um etwas anderes alsperson
.exported
fahne in@RestResource
zufalse
und der link wird nicht gerendert. Dies kann nützlich sein, wenn der Zeiger z.B. vonPersonDetails
ist nur relevant innerhalb des Codes, aber tatsächlich nicht in eine JSON-Repräsentation.