Я создал сервер приложений с использованием конечных точек 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;
}
}