0

Я создал сервер приложений с использованием конечных точек Google, это бэкэнд для приложения для обмена мгновенными сообщениями. У каждого пользователя есть список друзей.JsonMappingException: Бесконечная рекурсия в облачных конечных точках

Когда я создаю нового друга, я добавляю пользователей в список друзей друг друга, используя метод ниже. Тем не менее, это дает мне следующую ошибку, когда я добавляю друга из-за круговой зависимости.

Я рассмотрел другие вопросы и решения. Большинство из них структурированы по-разному, и они не решают мою проблему.

Один ответ на этом сайте рекомендует добавить @JSONIgnore, но у меня нет поля, чтобы добавить это. Я попытался поставить @JsonManagedReference, но я не мог понять, где положить @JSONBackReference. Другие примеры на этом веб-сайте, как правило, имеют другое поле, которое относится к родителям, но у меня его нет.

Спасибо за вашу помощь заранее.

Error 500 com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: 
Infinite recursion (StackOverflowError) (through reference chain: com.google.common.collect.TransformingRandomAccessList[0]- 
>com.net.myapplication.backend.model.User[\"friends\"]->com.google.common.collect.TransformingRandomAccessList[0]- 
>com.net.myapplication.backend.model.User[\"friends\"]- 

метод addFriend

@ApiMethod(name = "addFriend", httpMethod = "post") 
public User addFriend(@Named("regId") String regId, @Named("email") String email) { 
    User user = findRecord(regId); 
    User friend = findRecordByEmail(email); 

    if (user == null){ 
     log.info("User " + regId + " is not registered."); 
    } else{ 
     if (friend == null){ 
      log.info("User " + email + " is not registered."); 
     } else{ 
      if (hasFriend(user, friend)){ 
       log.info("User " + email + " is already a friend."); 
      } else { 
       user.getFriendsRef().add(Ref.create(friend)); 
       friend.getFriendsRef().add(Ref.create(user)); 

       ofy().save().entity(friend).now(); 
       ofy().save().entity(user).now(); 

       return friend; 
      } 
     } 
    } 
    return null; 
} 

модель пользователя

@Entity 
public class User { 

    @Id 
    Long id; 

    @Index 
    private String regId; 

    private String firstName; 

    private String lastName; 

    @Index 
    private String email; 

    private Language language; 

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

    public User() {} 

    public User(Long id, String regId, String firstName, String lastName, String email, Language language, List<Ref<User>> friends) { 
     this.id = id; 
     this.regId = regId; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
     this.language = language; 
     this.friends = friends; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getRegId() { 
     return regId; 
    } 

    public void setRegId(String regId) { 
     this.regId = regId; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Language getLanguage() { 
     return language; 
    } 

    public void setLanguage(Language language) { 
     this.language = language; 
    } 

    public List<User> getFriends() { 
     return Deref.deref(friends); 
    } 

    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    public List<Ref<User>> getFriendsRef(){ 
     return friends; 
    } 

    public void setFriends(ArrayList<Ref<User>> friends) { 
     this.friends = friends; 
    } 
} 

ответ

0

Похоже, этот вопрос: "Как я могу вернуть структуры данных с циклами через облако Endpoints"

Если он сериализует данные с помощью ванили Jackson (Jackson 1.x, из-за внешнего вида этой стоп-строки), вы не можете. Джексон 2 имеет поддержку JSOG, но это означало бы отказ от Облако Endpoints: