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?