4

Objectify (4.0.3b)과 함께 Google App Engine을 사용하는 Android 앱용 백엔드를 제공하려면 다음을 수행하십시오.JsonMappingException : Objectify의 OneToMany 관계에서 무한 재귀

백엔드에는 간단한 User 엔터티가 있으며, list of Users (친구)은 관계로 있습니다.

@Entity 
public class User { 

    @Id 
    private String email; 
    @Load 
    private List<Ref<User>> friends = new ArrayList<Ref<User>>(); 

    private User() { 
    } 

    public List<User> getFriends() { 
     ArrayList<User> friendList = new ArrayList<User>(); 
     for (Ref<User> ref : this.friends) { 
      friendList.add(ref.get()); 
     } 
     return friendList; 
    } 

    public void setFriends(List<User> friends) { 
     List<Ref<User>> refs = new ArrayList<Ref<User>>(); 
     for (User user : friends) { 
      refs.add(Ref.create(user)); 
     } 
     this.friends = refs; 
    } 

} 

지금은 예를 들어 데이터베이스에 저장된 사용자 다음 때 : user1user2 :

그의 친구 목록에서 user1user2와 그 반대의 경우도 마찬가지

사용자 객체를 가져 오기 위해 노력하고 (그 위의 순환 참조) 내 끝점에서 안드로이드 클라이언트가 다음 예외를 throw합니다 :

이 게시물에

com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]...

Infinite Recursion with Jackson JSON and Hibernate JPA issue 그들은 필드 또는 게터/세터 방법에 @JsonIgnore를 사용하는 것이 좋습니다. 하지만 클라이언트 측에서 생성 된 클라이언트 라이브러리 객체의 getter/setter 메소드로 친구 목록에 액세스해야하므로이 방법이 도움이되지 않습니다.

또 다른 팁은 ManagedReferenceBackReference이 같은 friends 필드를 일 대 일 것이기 때문에 내 경우에는 적용 할 수 없습니다 @JsonManagedReference and @JsonBackReference을 사용하는 것입니다.

Jackson 2.0부터 사용 가능한 @JsonIdentityInfo 주석은 내 문제를 해결할 수 있다고 생각합니다.

내 문제는 이제 Google App Engine에서이 주석을 어떻게 사용할 수 있는지 알 수 없다는 것입니다. GAE는 jackson-core-asl-1.9.11을 사용합니다.이 버전은 불행하게도 @JsonIdentityInfo을 가지고 있지 않습니다. 분명히 2.0 이하 버전에 따라 달라집니다.

@JsonIdentityInfo 기능을 사용하기 위해 Google App Engine에서 최신 Jackson 버전 (2.4)을 어떻게 사용할 수 있습니까?

내 문제가 더 나은 방법이 있습니까?

+0

동일한 문제가 있습니다.이 문제에 대한 확장 가능한 해결책을 찾으십니까? com.google.appengine.repackaged.org.codehaus.jackson.annotate. *'패키지에서'@JsonManagedReference'와 '@JsonBackReference'를 사용할 때 작동합니다. 그러나이 패키지를 사용해서는 안되기 때문에 적합하지 않습니다. 그것은 문서화되지 않았습니다 ... – Pintouch

답변

0

가장 좋은 방법은 엔드 포인트의 리턴 매개 변수로 사용하는 DTO 클래스를 정의하고이를 사용하여 JSON 응답을 평평하게 만드는 것입니다 (친구의 친구의 무한 루프를 보내지 않음을 의미).