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;
    }
}

讽刺的是,我没有访问这个特定的资源。 我还有其他的资源与createdBymodifiedBy - 是造成这个问题的人吗?


我怀疑你的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和你的TeamEntitycreatedBy引用。

我不是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

下一篇: 100x faster than HMatrix for small matrices?