Serializowanie tylko wybranych właściwości w kolekcjach encji

0

Witam, piszę aktualnie RESTowe API z wykorzystaniem Jersey, za serializację obiektów do JSONa odpowiada Jackson. Problem polega na tym, że jeżeli mam kolekcję encji zależnych, to chciałbym aby zwracany był id danej encji. Może na małym przykładzie:

Dwie encje:

@Entity
@Table(name = "users")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "name")
    private String name;
    @JoinColumn(name = "user_group_id", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private UserGroup userGroup;
    ...
}

@Entity
@Table(name = "users_groups")
public class UserGroup implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "name")
    private String name;
    @ManyToMany(mappedBy = "userGroups")
    private Set<Device> devices = new HashSet<>();
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userGroup")
    private Set<User> users = new HashSet<>();
    ...
}

Kawałek zasobu:

@Singleton
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public class TestResource {
    ...
    @GET
    @Transactional
    @Path("/usergrup")
    public Response complex() {
        EntityManager em = emp.get();

        UserGroup ug = new UserGroup();
        ug.setName("Grupa");
        
        em.persist(ug);
        
        User u1 = new User();
        u1.setName("user1");
        u1.setUserGroup(ug);
        ug.getUsers().add(u1);
        
        em.persist(u1);
        
        User u2 = new User();
        u2.setName("user2");
        u2.setUserGroup(ug);
        ug.getUsers().add(u2);
        
        em.persist(u2);

        return Response.ok(ug).build();
    }
}

Chciałbym, aby w takim przypadku pokazało wszystkie właściwości UserGruop oraz tylko id User'a. Jednocześnie nie chcę oczywiście ustawiać @JSONIgnore na pozostałych właściwościach User'a bo w innych metodach będę potrzebował tych szczegółów. Próbowałem wykorzystać @JSONView ale musiał bym natworzyć sporo widoków, a mam wrażenie, że musi istnieć jakieś prostsze rozwiązanie. Jakieś sugestie?

0

Zrób sobie jakieś POJO czy też jak kto woli DTO.

0

Przy znam szczerze, że nie do końca rozumiem Twój pomysł. Stworzyć dodatkowe POJO tylko do prezentacji? W sumie można, ale czy to nie jest trochę overkill? Nie ma jakiejś prostszej metody? Na chwilę obecną wrzuciłem Jacksona 2.1 i stosuję adnotację @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") na każdej encji i przynajmniej pozbyłem się nieskończonego rekursywnego serializowania encji, ale to jeszcze nie do końca to. Trochę lepiej z @JsonView ale przy adnotowaniu zasobu nie można użyć niestety kilku widoków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1