Spring Data Rest:检测到具有相同关系类型的多个关联链接
关于这个问题,我查了一下Spring Data Rest Ambiguous Association Exception,但是无法为我工作。
正如你可以在下面的代码中看到的,我添加了@RestResource
注释,其中rel
等于其他值。
与上面的问题类似,POST请求可以工作,但GET请求会抛出具有相同关系类型的多个关联链接的异常:
“无法写入JSON:检测到具有相同关系类型的多个关联链接!消除关联@ org.springframework.data.rest.core.annotation.RestResource(rel = createdBy,exported = true,path =,description=@org.springframework。 data.rest.core.annotation.Description(value =))@ javax.persistence.ManyToOne(optional = true,targetEntity = void,cascade = [],fetch = EAGER)@ javax.persistence.JoinColumn(referencedColumnName = ASSIGNABLE_ID,nullable = false,unique = false,name = CREATED_BY,updatable = true,columnDefinition =,foreignKey=@javax.persistence.ForeignKey(name =,value = CONSTRAINT,foreignKeyDefinition =),table =,insertable = true)private com.ag. persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity.createdBy using @RestResource!(through reference chain:org.springframework.hateoas.PagedResources [“_ embedded ”] - > java.util.UnmodifiableMap [“persons “] - > java.util.ArrayList [0]);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:检测到多个关联 同样的关系类型的链接! Disambiguate association @ org.springframework.data.rest.core.annotation.RestResource(rel = createdBy,exported = true,path =,description=@org.springframework.data.rest.core.annotation.Description(value =))@ javax.persistence.JoinColumn(referencedColumnName = ASSIGNABLE_ID,nullable = false,unique = false,name = CREATED_BY,updatable = true,可选)。javax.persistence.ManyToOne(optional = true,targetEntity = void,cascade = [],fetch = EAGER) columnDefinition =,foreignKey=@javax.persistence.ForeignKey(name =,value = CONSTRAINT,foreignKeyDefinition =),table =,insertable = true)private com.ag.persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity。 createdBy使用@RestResource! (通过引用链:org.springframework.hateoas.PagedResources [“_ embedded ”] - > java.util.UnmodifiableMap [“persons ”] - > java.util.ArrayList [0])“
这个错误似乎正在发生在这个类:
@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;
}
}
讽刺的是,我没有访问这个特定的资源。 我还有其他的资源与createdBy
和modifiedBy
- 是造成这个问题的人吗?
我怀疑你的PersonEntity
对象可能exported = false
。 正因为如此,在任何引用PersonEntity
将被添加到_links
你的部分TeamEntity
。 因为这两个PersonEntity
对象有createdBy
参考,它们与碰撞TeamEntity.createdBy
参考。
要了解发生了什么,这个例子可能有所帮助:
class Answer {
Question q; //JPA ManyToOne back-reference
}
class Question {
List<Answer> as; // JPA OneToMany reference
}
class UserAnswer {
Answer a;
Question q;
}
在我的情况下,因为Answer
只能存在于一个Question
,我们在我们的AnswerResource
上有以下AnswerResource
,以防止导出答案:
@RestResource(exported = false)
这会导致Answer
对象在父对象中序列化,而不是作为_links
部分中的引用,最终导致问题的原因....
当UserAnswer
序列化时,它会呈现如下所示的内容:
{
"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"
}
}
}
请注意,上面的“_links.question”是来自Answer
!
因此,如果您将Question
添加到UserAnswer
,您将看到您所问的错误,因为UserAnswer
本身也希望包含对Question
的_link引用。
就你而言,我认为你的PersonEntity
和你的TeamEntity
都createdBy
引用。
我不是100%确定解决方案是什么,我不知道你是否可以指定分层rel
名称。
简答:为所有(或至少更多)实体添加Spring Data存储库。 (在这种情况下,听起来你需要创建一个PersonRepository)。
长答案:
Spring Data Rest使用_links来避免发回整个JSON树,但它只能将_links映射到具有存储库的映射实体。
如果没有实体的存储库,Spring就不能使用链接,而只是将整个JSON对象放在响应中。
我想这个例外发生的事情是,一个较低的二级关系正在被放入一个_link中,并且其中不止一个具有相同的名称。
我并不是100%确定我理解这一切,但是当只有几个实体的存储库时,我遇到了同样的例外情况,并且当我为每个实体创建一个存储库时,问题就消失了。
链接地址: http://www.djcxy.com/p/22805.html上一篇: Spring Data Rest: Detected multiple association links with same relation type