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

Método atualizar

UsuarioDao

public Usuario carrega (int id){
    return (Usuario) this.manager.find(Usuario.class, id);
}

public void atualiza (Usuario usuario){
    manager.getTransaction().begin();
    this.manager.merge(usuario);
    manager.getTransaction().commit();
}

UsuarioController

public Usuario edita (int id){
    return usuarioDao.carrega(id);
}

public void altera(Usuario usuario){
    usuarioDao.atualiza(usuario);
    result.redirectTo(this).listaadm();
}

jps (edita)

<form action="<c:url value='usuario/altera' />" method="post">

jps (lista, que envia o id)

<a href="<c:url value='usuario/edita?usuario.id=${usuario.id}'/>">
8 respostas

Oi Thiago, desculpa, mas eu não entendi direito... é uma dúvida ou você ta compartilhando uma solução com a gente?

É uma dúvida, meu método não chama os atributos do usuario na edita.jsp.

acho que o link deveria ser assim:

<a href="<c:url value='usuario/edita?id=${usuario.id}'/>">

Sim, era isso. Só que ao confirmar, o form não atualiza os campos e joga na url:

/projeto/usuario/edita/5/

opa, ele ta chengando no método edita? o usuário está sendo carregado? caso sim, o objeto usuario na chave usuário deve estar disponível na jsp.. ${usuario}.

Faz esses passos?

Sim, está chegando, e populando dos campos corretamente.

Só que ele não altera os dados, depois de enviar o formulário.

Print do formulário edita: https://drive.google.com/open?id=0B7NlcsEHVJhhLUdNYlZBRk5zUFk

Segue o código:

edita.jps

...
<div>
    <form class="form-style" action="<c:url value='/usuario/${usuario.id}/'/>" method="POST">

        <label for="nome">Nome do usuário:</label>
        <input type="text" name="usuario.nome" id="nome" class="form-control" value="${usuario.nome}" required autofocus />

        <label for="email">Email:</label>
        <input type="text" name="usuario.email" id="email" class="form-control" value="${usuario.email}" required />

        <label for="tipo">Tipo de Usuário:</label>
        <select class="form-control" name="usuario.tipo" id="tipos" >  
            <c:forEach var="tip" items="${tipoUsuario}">  
                <option value="${tip.tipoUsuario}">${tip.tipoUsuario}</option>  
            </c:forEach>  
        </select>

        <label for="login">Login:</label> 
        <input type="text" name="usuario.login" id="login" class="form-control" value="${usuario.login}" required/>

        <button class="btn btn-success" type="submit" name="_method" value="PUT"> Alterar Usuário</button>
    </form>
</div>
...

UsuarioDao

    public Usuario edita(int id){
        result.include("tipoUsuario", TipoUsuario.values());
        return usuarioDao.carrega(id);
    }
    @Put("/usuario/{usuario.id}")
    public void altera(@Valid Usuario usuario){
        validator.onErrorRedirectTo(this).form();
        usuarioDao.atualiza(usuario);
        result.redirectTo(this).lista();
    }

UsuarioDao

public void atualiza (Usuario usuario){
        try{
            manager.getTransaction().begin();
            manager.merge(usuario);
            manager.getTransaction().commit();
        }catch (Exception e) {
            manager.getTransaction().rollback();
        }
    }
public Usuario carrega (int id){
        return (Usuario) this.manager.find(Usuario.class, id);
    }

Olha, não vou mentir... não vi nada de errado no seu código... você recebe um usuário supostamente válido.. se vc debuga o método que atualiza, o objeto está correto? se não da nenhum erro e ta tudo certo, eu realmente não sei o que pode ser :/.

solução!

Coloquei a anotação GET

    @Get("/usuario/{id}")
    public Usuario edita (int id){
        result.include("tipoUsuario", TipoUsuario.values());
        return usuarioDao.carrega(id);
    }

Depois mudei a url que envia o ID, aí deu tudo certo, obrigado.

<c:url value='/usuario/${usuario.id}'/> Editar