Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao receber Permissões de Usuario em controller

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>
2 respostas

Opa, olhei o código e ainda não consegui identificar nada de errado.. uma coisa estranha é que você recebe um parâmetro chamado permissoes, mas a classe usuario tem também um método chamado setPermissoes, talvez isso esteja gerando um erro estranho...

solução!

Eu enfrentei este mesmo problema fazendo requisições ajax, não encontrei solução para esta virgula passada antes do valor para objetos declarados no cabeçalho do método, porém encontrei uma alternativa através de HttpServletRequest. Segue exemplo de como contornei.

@RequestMapping(value="/url-do-recurso", method = RequestMethod.POST)
    public ModelAndView incluirItem(HttpServletRequest http, Locale locale){
        String parametro = http.getParameter("parametro");
            System.out.println("Parametro: "+parametro);

        ModelAndView mav = new ModelAndView("/url-redirecionamento");
        return mav;
    }

Espero ter ajudado.