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;
}
}
지금은 예를 들어 데이터베이스에 저장된 사용자 다음 때 : user1
및 user2
:
그의 친구 목록에서 user1
이 user2
와 그 반대의 경우도 마찬가지
사용자 객체를 가져 오기 위해 노력하고 (그 위의 순환 참조) 내 끝점에서 안드로이드 클라이언트가 다음 예외를 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 메소드로 친구 목록에 액세스해야하므로이 방법이 도움이되지 않습니다.
또 다른 팁은 ManagedReference
및 BackReference
이 같은 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)을 어떻게 사용할 수 있습니까?
내 문제가 더 나은 방법이 있습니까?
동일한 문제가 있습니다.이 문제에 대한 확장 가능한 해결책을 찾으십니까? com.google.appengine.repackaged.org.codehaus.jackson.annotate. *'패키지에서'@JsonManagedReference'와 '@JsonBackReference'를 사용할 때 작동합니다. 그러나이 패키지를 사용해서는 안되기 때문에 적합하지 않습니다. 그것은 문서화되지 않았습니다 ... – Pintouch