Spring data JPA problem to get list of object ManyToMany relationship

Viewed 598

I am trying to persist a user object that has a many-to-many relationship with role objects. When I save my user, I get the list of a role for that user, but in my ResponseEntity object I got an empty list of roles

My entities

@Entity
@Table(name = "RoleUtilisateur")
public class RoleEntite {
    @Id
    @Column(name = "role_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String nom;

    public RoleEntite() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

}

@Entity
@Table(name = "Utilisateurs")
public class UserEntite {
    @Id
    @Column(name = "utilisateur_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String nom;

    private String prenom;

    private String email;

    private String password;

    // Permettant d'activer ou désactiver le compte
    private boolean actived;

    // @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "utilisateur_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List<RoleEntite> roles = new ArrayList<RoleEntite>();

    public UserEntite() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isActived() {
        return actived;
    }

    public void setActived(boolean actived) {
        this.actived = actived;
    }

    @JsonIgnore
    public List<RoleEntite> getRoles() {
        return roles;
    }

    public void setRoles(List<RoleEntite> roles) {
        this.roles = roles;
    }

}

My UserServiceImpl

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public UserEntite createUser(UserEntite user) {
        UserEntite checkUser = userRepository.findByEmail(user.getEmail());

        if (checkUser != null)
            throw new RuntimeException("L'utilisateur existe deja en Base de donnée !");

        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));

        List<RoleEntite> mesRoles = new ArrayList<RoleEntite>();

        if (user.getRoles() != null) {

            for (RoleEntite role : user.getRoles()) {
                RoleEntite unRole = roleRepository.findByNom(role.getNom());
                mesRoles.add(unRole);
            }

            user.setRoles(mesRoles);

        }

        UserEntite newUser = userRepository.save(user);

        return newUser;
    }
}

My DTO

public class UserRequest {
    private String nom;

    private String prenom;

    private String email;

    
    private String password;

    @NotNull(message = "Ce champ ne doit etre null !")
    private boolean actived;

    private List<RoleEntiteRequest> roles;

    public UserRequest() {
        super();
        // TODO Auto-generated constructor stub
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isActived() {
        return actived;
    }

    public void setActived(boolean actived) {
        this.actived = actived;
    }

    public List<RoleEntiteRequest> getRoles() {
        return roles;
    }

    public void setRoles(List<RoleEntiteRequest> roles) {
        this.roles = roles;
    }

}

public class UserResponse {
    private Long id;
    private String nom;
    private String prenom;
    private String email;
    boolean actived;
    private List<RoleEntiteResponse> roles = new ArrayList<RoleEntiteResponse>();

    public UserResponse() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isActived() {
        return actived;
    }

    public void setActived(boolean actived) {
        this.actived = actived;
    }

    public List<RoleEntiteResponse> getRole() {
        return roles;
    }

    public void setRole(List<RoleEntiteResponse> role) {
        this.roles = role;
    }

}

My controller

@RequestMapping(value="users", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
    public ResponseEntity<UserResponse> saveUser(@Valid @RequestBody UserRequest userRequest) throws Exception {

        ModelMapper modelMapper = new ModelMapper();
        UserEntite userDto = modelMapper.map(userRequest, UserEntite.class);

        UserEntite createUser = userService.createUser(userDto);

        int id = createUser.getId().intValue();

        UserResponse userResponse = modelMapper.map(createUser, UserResponse.class);

        return new ResponseEntity<UserResponse>(userResponse, HttpStatus.CREATED);

    }

My problem is when I call my rest API in postman I get the UserResponseEntite with a UserResponse containing an empty role list. But the createUser variable contains a list of roles. When I map this object to UserResponse class, I get an empty role list. Can you help me, please?

enter image description here enter image description here

0 Answers
Related