Eu gostaria de tirar uma dúvida a respeito:
1°) Qual a melhor maneira de eu cadastrar um usuário passando a lista de ROLES do meu sistema através do binding do spring.
2°) Quando eu passo o valor do input Por @RequestParam("permissoes") o valor recebido que eu printo é: ",ROLE_ADMIN" com essa vírgula antes do ROLE_ADMIN, que erro é esse?
No meu banco está tudo salvo normal, não sei o que pode ser esse erro. Para lidar com isso seria fácil com gambiarras, mas gostaria de saber o melhor padrão de desenvolvimento para fazer isso.
Segue o código em meu controller:
@RequestMapping(value = "cadastrar-cliente", method = RequestMethod.POST)
public ModelAndView salvarUsuario(@RequestParam("permissoes") String role, @ModelAttribute("usuario") @Valid Usuario usuario, BindingResult result, WebRequest request, Errors errors, RedirectAttributes model){
ModelAndView mv = new ModelAndView("redirect:/usuarios");
System.out.println(role);
System.out.println(usuario);
//userDAO.salvarUsuario(usuario);
model.addFlashAttribute("usuario", usuario);
return mv;
}
Tenho o mapeamento do meu usuário:
@Entity
public class Usuario implements UserDetails{
private static final long serialVersionUID = 1L;
@Id
private String email;
private String nome;
private Boolean ativo;
private String senha;
@ManyToMany(fetch=FetchType.EAGER)
private List<Role> permissoes = new ArrayList<Role>();
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Role> getPermissoes() {
return permissoes;
}
public void setPermissoes(List<Role> permissoes) {
this.permissoes = permissoes;
}
public Boolean getAtivo() {
return ativo;
}
public void setAtivo(Boolean ativo) {
this.ativo = ativo;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.permissoes;
}
@Override
public String getPassword() {
return this.senha;
}
@Override
public String getUsername() {
return this.email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public String toString() {
return this.getNome() + " - " + this.getEmail();
}
}
E na view jsp minha do cadastro de usuários:
<form:form action="${spring:mvcUrl('UC#salvarUsuario').build()}" modelAttribute="usuario" method="POST">
<div class="form-group col-md-6">
<label for="nome">E-mail</label>
<!-- <input type="email" name="email" class="form-control" id="email" placeholder="Insira o e-mail do Usuário" > -->
<form:input cssClass="form-control" type="email" path="email" />
</div>
<div class="form-group col-md-6">
<!-- <input type="text" name="nome" class="form-control" id="nome" placeholder="Insira o nome do Usuário" autocomplete="false">-->
<label for="nome">Nome</label>
<form:input type="text" cssClass="form-control" path="nome" />
</div>
<div class="form-group col-md-6">
<!-- <input type="password" name="senha" class="form-control" id="senha" placeholder="Insira a senha do Usuário" autocomplete="false">-->
<label for="nome">Senha</label>
<form:input type="password" cssClass="form-control" path="senha" />
</div>
<div class="form-group col-md-6">
<label for="nome">Permissão</label>
<select class="form-control" name="permissoes" required>
<option value="" disabled selected>-------</option>
<c:forEach items="${roleDAO.carregarRolesAtivos()}" var="role">
<option value="${role.nome}">${role.nome}</option>
</c:forEach>
</select>
</div>
<div class="box-footer">
<button type="submit" class="btn btn-primary pull-right">Submit</button>
</div>
</form:form>