2012-11-29 4 views
8

내 엔티티에서 양방향 다 대다 관계가 있습니다. 아래의 예를 참조하십시오 :`양방향 다 대다 관계의 순환 참조

"java.lang.IllegalArgumentException가이 :/다시 관리 처리 할 수없는 내가 JSON이 직렬화 할 때

public class Collaboration { 

    @JsonManagedReference("COLLABORATION_TAG") 
    private Set<Tag> tags; 

} 

public class Tag { 

    @JsonBackReference("COLLABORATION_TAG") 
    private Set<Collaboration> collaborations; 

} 

을, 나는 다음과 같은 예외를 받고 있어요 참조 'COLLABORATION_TAG'. 관리되는 형식 (foo.Collaboration)와 호환되지 다시 참조 유형 (java.util.Set을) 사실

, 나는 javadoc에 명시 적으로 언급하기 때문에이 말이 알고 콜렉션에서 @JsonBackReference를 사용할 수 없다는 것을 의미합니다. 제 질문은이 문제를 어떻게 해결해야합니까? 내가 한 일은 부모 측에서 @JsonManagedReference 주석을 제거하고 자식 측에 @JsonIgnore를 추가 한 것입니다. 누군가이 접근법의 부작용이 무엇인지 말해 줄 수 있습니까? 다른 제안이 있습니까?

+2

당신은 잭슨 2.0을 사용할 수 있습니다에

@Entity @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") public class Collaboration { .... 

으로 잭슨이 라이브러리에 제공됩니다. http://stackoverflow.com/questions/10065002/jackson-serialization-of-entities-with-birectional-relationships-avoiding-cyc을 참조하십시오. –

+1

'JsonIdentityInfo' 주석은 훌륭합니다. 감사합니다. @EugeneRetunsky! 나는이 페이지가 어떻게 작동 하는지를 배우는 데 매우 유용하다는 것을 알았다 : http://wiki.fasterxml.com/JacksonFeatureObjectIdentity –

+0

나는'JsonManagedReference'와'JsonBackReference'를 시도했다. 아무 것도 작동하지 않는다. 그러나 @ SimonAndréForsberg의 링크는 매우 흥미롭고 잘 작동합니다. – yas

답변

3

다음 해결책을 구현했습니다.

관계의 한쪽 끝은 상위로 간주됩니다. 잭슨 관련 주석이 필요하지 않습니다.

public class Collaboration { 

    private Set<Tag> tags; 

} 

관계의 다른면은 다음과 같이 구현됩니다.

public class Tag { 

    @JsonSerialize(using = SimpleCollaborationSerializer.class) 
    private Set<Collaboration> collaborations; 

} 

나는 어떤 순환 참조가 발생하지 않습니다 있는지 확인 할 수있는 사용자 지정 serializer를 사용하고 있습니다. 시리얼 라이저는 다음과 같이 구현 될 수 있습니다 :

public class SimpleCollaborationSerializer extends JsonSerializer<Set<Collaboration>> { 

    @Override 
    public void serialize(final Set<Collaboration> collaborations, final JsonGenerator generator, 
     final SerializerProvider provider) throws IOException, JsonProcessingException { 
     final Set<SimpleCollaboration> simpleCollaborations = Sets.newHashSet(); 
     for (final Collaboration collaboration : collaborations) { 
      simpleCollaborations.add(new SimpleCollaboration(collaboration.getId(), collaboration.getName()));     
     } 
     generator.writeObject(simpleCollaborations); 
    } 

    static class SimpleCollaboration { 

     private Long id; 

     private String name; 

     // constructors, getters/setters 

    } 

} 

이 시리얼 라이저는 협업 엔티티의 제한된 세트의 특성만을 표시합니다. "tags"속성이 생략되었으므로 순환 참조가 발생하지 않습니다.

이 주제에 대한 좋은 내용은 here입니다. 비슷한 시나리오를 가지고있을 때 모든 가능성을 설명합니다.

+0

나는 similalr 상황을 http://stackoverflow.com/questions/28179369/spring-rest-json-can-not-handle-managed-back-reference-defaultreference-415에서 설명했다. 나는 아직도 찾을 수 없었다. 주석을 사용하는 직접 솔루션. – zencv

1

매우 편리한 인터페이스 구현은 받는다는

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.0.2</version> 
</dependency> 
+0

FYI : 정확한 메이븐 종속성은 ' jackson-annotations'이어야한다고 생각합니다. 어쨌든 그건 내 빌드에 효과가있었습니다. – FrustratedWithFormsDesigner

관련 문제