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 :

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;
	}
 
}
- 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
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;
	}
 
}
- 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
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;
 
	}
 
}
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.

Pourtant, lorsque je reçoit le tout dans mon controller angularJs et que j'affiche dans la console :

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
		}
	);
 
});
*voir commentaires pour voir les sorties consoles

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'aider merci d'avance