Двунаправленная сериализация Джексона со связывающим объектом

#java #json #serialization #jackson

#java #json #сериализация #джексон

Вопрос:

Я пытаюсь правильно сериализовать объект, который доступен для двух объектов, а также для его собственного объекта. Я хочу иметь возможность просматривать администраторов сайта, а также сайты, администратором которых является пользователь, и администраторов определенного сайта. Я пробовал использовать @JSONbackmanaged, и он просто выдавал только идентификаторы. Возможно ли что-то подобное? Это псевдокод, поэтому возможны синтаксические ошибки, но он максимально приближен к возможному. Hibernate управляет ORM и загрузкой этих pojo.

 public class SiteAdmin {

     private Integer id;
     private Site site;
     private User user;

     @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
     public Facility getSite() {
        return this.sitey;
     }

     public void setSite(Site site) {
         this.site = site;
     }

     @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
     public User getUser() {
         return this.user;
     }

     public void setUser(User user) {
        this.user = user;
     }
}
  

и в user.java У меня есть

 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public Set<SiteAdmin> getSiteAdmins() {
    return this.siteAdmins;
}
  

и в site.java У меня есть

 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
public Set<SiteAdmin> getSiteAdmins() {
    return this.siteAdmins;
}
  

То, что я ищу при сериализации, выглядит примерно так

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

 {
   id: 2
   name: 'foo',
   siteAdmin: {
       user: 2,
       site: { id: 6, name: 'site' }
   }
}
  

Для сайта

 {
   id: 6
   name: 'site',
   siteAdmins: [
      {
        user: {id : 2, name: 'foo'},
        site: 6 
      },
      {
        user: {id : 3, name: 'bar'},
        site: 6 
      },
   ]
}
  

Вместо этого я получаю что-то вроде этого

 {
   id: 6
   name: "site",
   siteAdmins: [
      {
        site: {
           id: 6
           name: "site",
           siteAdmins: [ 
             site: 6,
             user: {id : 2, name: "foo"}
           ]
         },
         user: {id : 3, name: "bar"}
       }, 
       1
  ]
}
  

Ответ №1:

Я смог решить эту проблему, используя @JsonIgnoreProperties вместо @JsonIdentityInfo. Он будет игнорировать дочерние свойства в set. ex.

В site.java

 @JsonIgnoreProperties({"site"})
public Set<SiteAdmin> getSiteAdmins() {
    return this.siteAdmins;
}
  

В user.java

 @JsonIgnoreProperties({"user"})
public Set<SiteAdmin> getSiteAdmins() {
    return this.siteAdmins;
}