Bonjour à tous,
ça fais quelque jours que je n'ai pas poser de questions ici donc ça prouve que je commence à me débrouiller tout seul :p. Seulement, là, je me heurte à un problème depuis 2-3 jours et je ne trouve pas de solution. J'espère que vous pourrez me débloquer.
Voici le context : Je dispose de trois tables. USER, CLIENT et USERS_CLIENTS. C'est une relation n-p entre USER et CLIENT et USERS_CLIENTS est la table d'association. Puisque c'est une relation n-p, je me suis débrouillé pour mettre en place un système avec @OneToMany + @EmbeddedId + @Embeddable et tout le tralala Spring pour que ça fonctionne. Je ne suis pas trop mécontent du résultat.
Le hic est le suivant, je dispose d'une méthode @RequestMapping d'une classe @RestController qui me renvoi une classe UserDetailsDto.
Cette classe contient une List<UsersClients>.
UsersClients contient un @EmbeddedId private UserClientId pkUsersClients.
Et UserClientId est une classe @Embeddable qui contient un User et un Client.
Voici le code de tout ce petit monde :
- Mon entité Client qui correspond à la table CLIENT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 @Entity @Table(name="client") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "idClient") public class Client { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id_client") private long idClient; /** * nom du client */ private String name; @OneToMany(mappedBy="pkUsersClients.client", cascade=CascadeType.ALL) private Set<UsersClients> usersClients = new HashSet<UsersClients>(); // Constructeurs et getters setters }
- Ma classe @Embeddable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 @Embeddable public class UserClientId implements Serializable{ private static final long serialVersionUID = 1L; private User user; private Client client; @ManyToOne(cascade=CascadeType.ALL) public User getUser() { return user; } public void setUser(User user) { this.user = user; } @ManyToOne(cascade=CascadeType.ALL) public Client getClient() { return client; } public void setClient(Client client) { this.client = client; } }
- Ma classe UsersClients qui représente la table d'association et qui contient le EmbeddedId :
- Le DTO qui correspond à la response de mon web service REST :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 @Entity @Table(name="users_clients") @AssociationOverrides( { @AssociationOverride( name="pkUsersClients.user", joinColumns = @JoinColumn(name="id_user") ), @AssociationOverride( name="pkUsersClients.client", joinColumns = @JoinColumn(name="id_client") ) } ) public class UsersClients { private UserClientId pkUsersClients = new UserClientId(); @Temporal(TemporalType.DATE) private Date date_begin; @EmbeddedId public UserClientId getPkUsersClients() { return pkUsersClients; } public void setPkUsersClients(UserClientId pkUsersClients) { this.pkUsersClients = pkUsersClients; } @Transient public User getUser() { return getPkUsersClients().getUser(); } public void setUser(User user) { getPkUsersClients().setUser(user); } @Transient public Client getIdClient() { return getPkUsersClients().getClient(); } public void setIdClient(Client client) { getPkUsersClients().setClient(client); } public Date getDate_begin() { return date_begin; } public void setDate_begin(Date date_begin) { this.date_begin = date_begin; } }
- et enfin mon web service REST :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public class UserDetailsDto { private List<UsersClients> usersClients; /** * @param idUser */ public UserDetailsDto(List<UsersClients> _usersClients) { super(); this.usersClients = _usersClients; } /** * @return the usersClients */ public List<UsersClients> getUsersClients() { return usersClients; } /** * @param usersClients the usersClients to set */ public void setUsersClients(List<UsersClients> usersClients) { this.usersClients = usersClients; } }
A partir de là, si je suis en mode debug, je peux voir que mon DTO, les UserClientId contiennent bien des objets User et Client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 @RestController public class UserDetailsRest { @Autowired private UserDao userDao; @Autowired private UserDatasDao userDatasDao; @Autowired private UsersClientsDao usersClientsDao; @RequestMapping("get-user-details") public UserDetailsDto getUserDetails(@RequestBody Long idUser){ User user = userDao.findByIdUser(idUser); UserDatas userDatas = userDatasDao.findByIdUser(user); List<UsersClients> usersClients = usersClientsDao.findByPkUsersClientsUser(user); UserDetailsDto userDetailsDto = new UserDetailsDto(userDatas, usersClients); return userDetailsDto; } }
Pourtant, lorsque je reçoit le tout dans mon controller angularJs et que j'affiche dans la console :
*voir commentaires pour voir les sorties consoles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 myModule.controller('UserDetailsCtrl',function($http, idUser){ var self = this; $http.post('/get-user-details', idUser).then( function(response){ self.clients = response.data.usersClients; for(client of self.clients){ console.log("pkUsersClients : " + client.pkUsersClients); // console display "[object Object]" console.log("client : " + client.pkUsersClients.client); // console display "1" instead of User Object console.log("keys : " + Object.keys(client.pkUsersClients)); // console display "keys : user,client" console.log("name : " + client.pkUsersClients.client.name); // display "undefined" } }, function(){ // error } ); });
Je ne comprend pas pourquoi dans la response j'ai des objects et dans mon angularjs, c'est des int...
J'espère avoir assez bien synthetisé le problème et que quelqu'un pourra m'aidermerci d'avance
Partager