2014-09-14 25 views
7

Về câu hỏi này, tôi đã kiểm tra Spring Data Rest Ambiguous Association Exception nhưng không thể làm cho nó hoạt động cho tôi.Nghỉ ngơi dữ liệu mùa xuân: Phát hiện nhiều liên kết liên kết với cùng loại quan hệ

Như bạn có thể thấy trong mã bên dưới, tôi đã thêm @RestResource chú thích với rel bằng một số giá trị khác.

Tương tự như các câu hỏi trên, yêu cầu POST làm việc, nhưng yêu cầu GET ném ngoại lệ về nhiều liên kết gắn với cùng một loại quan hệ:

"Không thể ghi JSON: Phát hiện nhiều liên kết gắn với cùng loại liên quan ! Chia sẻ liên kết @ org.springframework.data.rest.core.annotation.RestResource (rel = createdBy, xuất khẩu = true, path =, [email protected]iption (value =)) @ javax.persistence.ManyToOne (tùy chọn = true, targetEntity = void, cascade = [], lấy = mong muốn) @ javax.persistence.JoinColumn (referencedColumnName = ASSIGNABLE_ID, nullable = false, độc đáo = false, name = CREATED_BY, có thể cập nhật = true, ColumnDefinition =, [email protected] (name =, value = CONSTRAINT, foreignKeyDefinition =), table =, insertable = true) private com.ag.persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity.createdBy sử dụng @RestResource! (thông qua chuỗi tham chiếu: org.springframework.hateoas.PagedResources [\ "_ embedded \"] -> java.util.UnmodifiableMap [\ "người \"] -> java.util.ArrayList [0]); ngoại lệ lồng nhau là com.fasterxml.jackson.databind.JsonMappingException: Đã phát hiện nhiều liên kết liên kết có cùng loại quan hệ! Phân định rõ ràng liên kết @ org.springframework.data.rest.core.annotation.RestResource (rel = createdBy, xuất khẩu = true, path =, [email protected]iption (value =)) @ javax.persistence.ManyToOne (không bắt buộc = true, targetEntity = vô hiệu, cascade = [], lấy = mong muốn) @ javax.persistence.JoinColumn (referencedColumnName = ASSIGNABLE_ID, nullable = false, độc đáo = false, tên = CREATED_BY, updatable = true, columnDefinition =, [email protected] (name =, giá trị = CONSTRAINT, foreignKeyDefinition =), table =, insertable = true) private com.ag.persistence.domain.PersonEntity com.ag.persistence.domain.TeamEntity.createdBy u hát @RestResource! (thông qua chuỗi tham chiếu: org.springframework.hateoas.PagedResources [\ "_ embedded \"] -> java.util.UnmodifiableMap [\ "người \"] -> java.util.ArrayList [0]) "

lỗi này có vẻ xảy ra trong lớp này:.

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

Trớ trêu thay, tôi không truy cập vào tài nguyên cụ thể này, tôi cũng có các nguồn lực khác với createdBymodifiedBy - là nó trở thành một trong gây ra vấn đề này

?
+0

Có thực thể nào khác có thuộc tính 'createdBy' không? Ví dụ 'PersonEntity'? – zeroflagL

+0

Tất cả các thực thể của tôi có bốn trường: '' createdBy'', '' modifiedBy'', '' createdDate'' và '' modifiedDate'' – Chad

+0

Đó có thể là vấn đề. Hãy xem [câu hỏi này] (http://stackoverflow.com/questions/24426644/spring-data-rest-detected-multiple-association-links-with-same-relation-type). Cả 'PersonEntity' trong' TeamEntity' của bạn có thể phơi bày một liên kết 'createdBy'. – zeroflagL

Trả lời

2

Tôi nghi ngờ rằng bạn có thể có exported = false trên đối tượng PersonEntity của bạn. Do đó, mọi tham chiếu trong PersonEntity sẽ được thêm vào phần _links trong số TeamEntity của bạn. Vì cả hai đối tượng PersonEntity đều có tham chiếu createdBy, chúng đang va chạm với tham chiếu TeamEntity.createdBy.

Để hiểu những gì đang xảy ra ví dụ này có thể giúp:

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

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

class UserAnswer { 
    Answer a; 
    Question q; 
} 

Trong trường hợp của tôi, bởi vì một Answer chỉ có thể tồn tại trong một Question, chúng tôi đã sau đây trên AnswerResource của chúng tôi, để ngăn chặn Đáp chặn xuất:

@RestResource(exported = false) 

Điều này gây Answer đối tượng được đăng trong các đối tượng phụ huynh, chứ không phải là một tài liệu tham khảo trong phần _links, và kết thúc này lên là nguyên nhân của vấn đề ....

Khi UserAnswer là đăng, nó ám một cái gì đó như thế này:

{ 
    "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" 
    } 
    } 
} 

Lưu ý rằng "_links.question" trên là từ Answer!

Vì vậy, nếu bạn thêm một Question để UserAnswer, bạn sẽ thấy những lỗi mà bạn đang hỏi về, bởi vì bản thân UserAnswercũng muốn bao gồm một tham chiếu _link vào một Question.

Trong trường hợp của bạn, tôi nghĩ rằng PersonEntityTeamEntity cả hai đều có tham chiếu createdBy.

Tôi không chắc chắn 100% giải pháp là gì, tôi không biết liệu bạn có thể chỉ định tên phân cấp rel hay không.

+1

Tôi tạo ra một vấn đề JIRA này như tôi nghi ngờ đó là một lỗi: https: //jira.spring .io/browse/DATAREST-520 –

0

Câu trả lời ngắn: Thêm kho lưu trữ dữ liệu mùa xuân cho TẤT CẢ (hoặc ít nhất là hơn) đối tượng của bạn. (Trong trường hợp này, có vẻ như bạn cần tạo một PersonRepository).

Long trả lời:

mùa xuân dữ liệu phần còn lại sử dụng _links để tránh việc gửi lại toàn bộ cây JSON, nhưng nó chỉ có thể làm cho _links cho các đối tượng ánh xạ có Repositories.

Nếu không có kho lưu trữ cho thực thể, Spring không thể sử dụng liên kết và thay vào đó, chỉ cần đặt toàn bộ đối tượng JSON vào phản hồi.

Tôi nghĩ điều xảy ra với ngoại lệ này là mối quan hệ cấp thấp hơn, thứ hai đang được đưa vào _link và nhiều hơn một trong số này có cùng tên.

Tôi không chắc chắn 100% tôi hiểu tất cả, nhưng tôi có cùng ngoại lệ khi chỉ có kho lưu trữ cho một vài thực thể và khi tôi tạo Kho lưu trữ cho mọi thực thể thì vấn đề đã biến mất.

Các vấn đề liên quan