2
respostas

Duvidas ao implementar um formulario de atualização de roles do usuário

Olá Pessoal!

Estou com problemas ao implementar a funcionalidade de atualização de roles do usuário.

Conforme o código abaixo, eu consigo recuperar e apresentar um usuário já com sua roles checkadas além daquelas dispníveis para checkagem:

    @RequestMapping("/detalhe/{id}")
    public ModelAndView detalhe(@PathVariable("id") long id){
        ModelAndView modelAndView = new ModelAndView("usuarios/roles");

//        Recupera o usuario e suas roles
        Usuario usuario = dao.find(id);
        List<Role> rolesDisponiveis = roleDAO.listAll();

        List<Role> checkedRoles = usuario.getRoles();        
        usuario.setRoles(checkedRoles);


        List<Role> roles = new ArrayList<Role>();
        for (Role role:rolesDisponiveis){
            roles.add(role);
        }

        modelAndView.addObject("usuario", usuario);
        modelAndView.addObject("roles", roles);

        return modelAndView;
    }

Abaixo está a view que apresenta os dados:

<form:form action="${s:mvcUrl('UC#atualizarRoles').build() }" method="post" commandName="usuario">
            <div class="form-group">
                <form:label path="roles">Permissões: </form:label>
                <form:checkboxes path="roles"  items="${roles}" cssClass="form-control"/>
                <form:errors path="roles" />
            </div>

            <button type="submit" class="btn btn-primary">Atualizar</button>
        </form:form>

Eu não estou conseguindo implementar na classe controladora o método que vai receber meus objetos, fazer a atualização e encaminhar para a listagem de usuários.

2 respostas

Pessoal, Não sei se fiz da forma mais prática possivel, mas funcionou da seguinte maneira:

//Atualizar o usuario com as roles selecionadas
    @RequestMapping(value="lista")
    public ModelAndView atualizarRoles(Usuario usuario){
        ModelAndView modelAndView = new ModelAndView("usuarios/lista");

        List<Role> rolesSelecionadas = usuario.getRoles();
        Usuario usuarioSelecionado = dao.findUser(usuario.getId());
        usuarioSelecionado.setRoles(rolesSelecionadas);

        System.out.println("usuario com novas roles selecionadas: " + usuario.getRoles().toString());

        dao.update(usuarioSelecionado);

        List<Usuario> usuarios = dao.listar();
        modelAndView.addObject("usuarios", usuarios );
        return modelAndView;
    }

Apesar de ter funcionado, não entendi por que não consegui passar o objeto usuario preenchido na view detalhe (). Eu tive que recuperá-lo a partir do id preenchido em input hidden no JSP correspondente a view:

<form:form action="${s:mvcUrl('UC#atualizarRoles').build() }" method="post" modelAttribute="usuario">
            <div class="form-group">
                <form:label path="roles">Permissões: </form:label>
                <form:checkboxes path="roles"  items="${roles}" cssClass="form-control"/>
                <form:errors path="roles" />
            </div>
            <form:hidden path="id" value="${usuario.id}"/>

            <button type="submit" class="btn btn-primary">Atualizar</button>
        </form:form>

Se alguém puder me explicar como fazer isso de uma forma mais prática fico agradecido.

olá amigo, não sei responder em relação a sua dúvida, mas fiquei curioso em relação a query que eu estou tentando fazer para o udpate das roles. No seu dao.update Vc faz um insert das roles selecionadas? e para retirar uma role já selecionada vc faz um delete?