2011-03-17 2 views
8

POJO를 JSON으로 직렬화하려고하지만 순환 참조 문제가 발생했습니다. 나는 @JsonBackReference@JsonManagedReference을 사용하여 one to many와 reverse relationship을 다루는 방법을 안다.많은 수 많은 최대 절전 모드 양방향 매핑으로 인해 json serializer에서 순환 참조를 해결하는 방법은 무엇입니까?

양방향 다 대다 관계 (예 : 학생이 많은 과목을 수강 할 수 있고 각 과목에 많은 수강생이 등록 될 수 있음)에서 부모가 자녀 및 자녀 참조를 부모에게 다시 참조하고 여기에서 시리얼 라이저가 사망합니다. 내 이해에 따라 나는 @JsonBackReference을 사용할 수 없다. 속성의 값 유형은 빈이어야한다 : 콜렉션, 맵, 배열 또는 열거 일 수 없다.

이 시나리오를 어떻게 처리 할 수 ​​있습니까?

답변

8

@JsonIgnoreProperties("someField")을 릴레이션의 한쪽에 사용할 수 있습니다 (주석은 클래스 수준 임). 당신이 컬렉션 개체가있는 경우 또는 @JsonIgnore

+0

아래에 언급 된 몇 가지 추가 사항 외에 비슷한 문제가 해결되었습니다. – jpitt42

-1

이 작동하고 JSON 직렬화 할 수있는 지금 얻을 개체를해야하고 그것이

collection<object> listobj 

var jsonObj = from c in listobj 
        select new 
       { 
        Prop1 = c.Prop1 
        ... 
       } 

을하자 깨끗한 또한 변환 도저 매핑을 사용할 수 있습니다

+0

.NET/LINQ 솔루션이 Java/Spring에서 작동하지 않습니다. – wrschneider

0

POJO를 맵핑하고 필드를 제외하십시오. 예를 들어 우리가 두 개의 클래스 PojoA 및 PojoB 양방향 관계를 가지고있는 경우에, 우리는이

<mapping map-id="mapA" map-null="false"> 
    <class-a>com.example.PojoA</class-a> 
    <class-b>java.util.Map</class-b> 
    <field> 
    <a>fieldA</a> 
    <b>this</b> 
    </field> 
    <field map-id="mapB"> 
     <a>pojoB</a> 
     <b>this</b> 
     <b-hint>java.util.Map</b-hint> 
    </field> 
</mapping> 

<mapping map-id="mapB" map-null="false"> 
    <class-a>com.example.PojoB</class-a> 
    <class-b>java.util.Map</class-b> 
    <field-exclude> 
    <a>pojoA</a> 
    <b>this</b> 
    </field-exclude> 
</mapping> 

같은 매핑 그럼 당신은 속성으로 위의 도저 매핑 파일을 설정 빈을 정의 정의합니다.

<bean id="mapper" class="org.dozer.DozerBeanMapper"> 
    <property name="mappingFiles"> 
    <list> 
     <value>dozerMapping.xml</value> 
    </list> 
    </property> 
</bean> 

그런 다음 클래스에서 것을 당신은

public class TestClass 
{ 
    @Autowired 
    DozerBeanMapper mapper; 

    public Map<String,Object> serializeObject(PojoA pojoA) 
    { 
      return ((Map<String, Object>) mapper.map(pojoA, Map.class, "mapA")); 
    } 
} 

Dozer manual here

를 직렬화되는 곳.

0

@Bozho 이미 언급 한 것에 강론 ...

내가 Google 클라우드 엔드 포인트를 사용하고 있기 때문에 지금 잭슨 1 붙어있어, 그래서 이것은 여전히 ​​잭슨이 아웃 된 경우에도 어떤 사람들은 도움이 될 수 있습니다 잠시 동안. 전체 객체를 직렬화 할 필요는 없지만 참조는 여전히 필요합니다.

순환 참조가 발생하는 필드에 @JsonIgnore를 넣었지만 각각에 대해 새로운 getter를 만들어서 플랫 참조가 여전히 내 API에 반환되도록했습니다. "foo는"생략하면서 클라우드 엔드 포인트와

@JsonIgnore 
private FooClass foo; 

public String getFooKey() 
... 

, 평평한 "fooKey"이 결과는 GET 페이로드에 반환.

1

@Bozho가 @JsonIgnoreProperties를 사용하려고 대답 했으므로이 기능을 사용해보십시오. 다음은

는 @JsonIgnoreProperties 내 모델입니다 : @JsonIgnoreProperties의 값 속성에서

@Entity 
public class Employee implements Serializable{ 
    @ManyToMany(fetch=`enter code here`FetchType.LAZY) 
    @JoinTable(name="edm_emp_dept_mappg", 
     joinColumns={@JoinColumn(name="emp_id", referencedColumnName="id")}, 
     inverseJoinColumns={@JoinColumn(name="dept_id", referencedColumnName="id")}) 
    @JsonIgnoreProperties(value="employee") 
    Set<Department> department = new HashSet<Department>(); 
} 


@Entity 
public class Department implements Serializable { 
    @ManyToMany(fetch=FetchType.LAZY, mappedBy="department") 
    @JsonIgnoreProperties(value="department") 
    Set<Employee> employee = new HashSet<Employee>(); 
} 

, 우리는 카운터의 수집 type 속성 (관련) 모델을 제공해야합니다.