2013-06-30 6 views
11

순환 참조에 문제가 있습니다.Json and Java - 순환 참조

나는 내가

java.lang.IllegalStateException: 
    Cannot call sendError() after the response has been committed 

객체를 생성하는 결과로 내가 무한 응답을 얻을 수 있도록 몇 가지 참조가 개체를 반환 할 때 프런트 엔드 개체를 반환 나머지 웹 서비스는 문제가있다 Hibernate Code Generation에 의해 자동으로 생성되고 나는 백엔드에서 순환 참조가 필요하다. 필자는 Jackson을 사용하여 프론트 엔드에 정보를 보내기 전에 그것을 제거해야한다.

컨트롤러 방법 헤더는 다음과 같습니다

내가 JSON으로 변환 할 explicite 아무것도 아니에요
@RequestMapping(value="/list", method=RequestMethod.POST) 
public @ResponseBody eventResponse list(@RequestBody String sessionID) { 

,이있는 뉴비 그리고 난 잭슨이 자동으로 해결한다고 생각합니다.

+1

http://wiki.fasterxml.com/JacksonFeatureBiDirReferences –

답변

23

두 가지 방법으로 문제를 해결할 수 있습니다. 엔티티를 외부에 노출해야하는 경우 순환 참조가 발생하는 속성에 @JsonIgnore을 추가하는 것이 좋습니다. 이것은 잭슨에게 그 재산을 연대시키지 말라고 말할 것입니다.

또 다른 방법은 Jackson에서 제공하는 양방향 기능을 사용하는 것입니다. @JsonManagedReference 또는 @JsonBackReference을 사용할 수 있습니다. @JsonManagedReference은 속성의 "전달"부분이며 정상적으로 직렬화됩니다. @JsonBackReference은 참조의 "뒤"부분입니다. 직렬화되지 않고, "순방향"유형이 직렬화 될 때 재구성됩니다.

예제 here을 확인할 수 있습니다.

이것은 귀하의 의견을 언급합니다. 나는이 경우 외부 세계가 볼 수있는 DTO를 사용하고 싶을 것이라고 생각합니다. 내 엔티티를 외부에 공개하고 싶지 않기 때문에이 방법이 마음에 듭니다. 이것은 Jackson 주석이 DTO에 있고 Enity에 있지 않다는 것을 의미합니다. 엔티티를 DTO로 변환하는 일종의 매퍼 또는 변환기가 필요합니다. 이제 엔티티를 변경할 때 매퍼/변환기를 수정하지 않으면 DTO에 전파되지 않습니다. 엔티티를 변경할 때 변경 사항을 공개할지 여부를 결정할 수 있기 때문에 이것이 정상이라고 생각합니다.

UPDATE

는 잭슨의 양방향 관계를 처리 할 수있는 다양한 방법에 대한 내용이수록 좋은 블로그 게시물 here 있습니다. @JsonIgnore, @JsonManagedReference@JsonBackReference, @JsonIdentityInfo, @JsonView 및 사용자 지정 serializer를 사용하는 솔루션을 설명합니다. 그것은 당신이 사용할 수있는 다양한 기법에 대한 꽤 포괄적 인 글입니다.

+0

네, 이에 대해 읽었습니다. 하지만 그 일은 Hibernate에 의해 생성 된 엔티티를 "만지기"를 원하지 않는다는 것입니다. 데이터베이스가 계속 증가하고 있으므로 언제든지 추가 할 것이므로 모든 엔터티를 다시 수정해야합니다. 제가 이해 한대로 두 옵션 모두에 대해 엔티티를 수정해야합니다. 맞습니까? – Faabass

+0

왜 downvote? –

5

단일 주석 @JsonIdentityInfo이 문제를 해결합니다. 또한 순환 참조를 처리합니다. Reference

+0

유일한 문제는 신원 필드가 null 일 때입니다. 그 다음에는 사각형 1 - 순환 참조로 되돌아갑니다. – anton1980