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

Página de Alteração não carrega os dados do usuário e cria um novo ao Salvar

Olá pessoal!

Preciso de ajuda, estou tentando fazer a alteração de um usuário, mas não está carregando os dados do usuário e quando salvo, grava um novo registro. Inclui o input hidden do ID do usuário, mas mesmo assim não vem registro nenhum, fica vazio. Mesmo na URL ficando o ID correto. O que pode estar acontecendo? Debuggando, vi que a passagem de parâmetros está correta nos métodos de busca por ID e de alteração. Não entendo porque não traz os dados do usuário. Segue código:

@Controller
public class UsuarioController {
    private UsuarioDao usuarioDao;
    private Result result;
    private Validator validator;

    public UsuarioController(){
    }

    @Inject
    public UsuarioController(UsuarioDao usuarioDao, Result result, Validator validator){
        this.usuarioDao = usuarioDao;
        this.result = result;
        this.validator = validator;
    }
    public void form(){}
    @IncludeParameters    
    public void adiciona(@Valid Usuario usuario){
        validator.onErrorRedirectTo(this).form();
        usuarioDao.adiciona(usuario);

        result.include("msg_usuarioSalvoSucesso", "Usuário salvo com sucesso!");
        result.redirectTo(this).lista();
    }
    @IncludeParameters    
    public Usuario editar(int id, Result result){
        Usuario usuarioEncontrado = usuarioDao.pegaPorId(id);
        result.of(this).form();
        result.include(usuarioEncontrado);
        return usuarioEncontrado;
    }
    public void lista(){
        List<Usuario> usuarios = usuarioDao.lista();
        result.include("usuarios", usuarios);
    }
}
@RequestScoped
public class UsuarioDao {
private EntityManager manager;

    public UsuarioDao(){}

    @Inject
    public UsuarioDao(EntityManager manager){
        this.manager = manager;        
    }

    public void adiciona(Usuario usuario){
            if (usuario != null) {
                manager.getTransaction().begin();
                manager.merge(usuario);
                manager.getTransaction().commit();
            }else {
                manager.getTransaction().begin();
                manager.persist(usuario);
                manager.getTransaction().commit();
            }            
    }

    public void exclui(Usuario usuario){
        manager.getTransaction().begin();
        manager.remove(usuario);
        manager.getTransaction().commit();
    }

    public List<Usuario> lista(){
        TypedQuery<Usuario> query = manager.createQuery("select u from Usuario u", Usuario.class);

        return query.getResultList();
    }

    public Usuario getByid(final int id){
        return manager.find(Usuario.class, id);
    }

    public Usuario busca(String login, String senha) {
        try {
            TypedQuery<Usuario> query = manager.createQuery("select u from Usuario u "
                    + " where u.login = :login and u.senha = :senha", Usuario.class);
            query.setParameter("login", login);
            query.setParameter("senha", senha);

            return query.getSingleResult();
        } catch (Exception e) {
            // TODO: handle exception
            return null;
        }
    }
    public Usuario pegaPorId(int id) {
        try {
            return this.manager.createQuery("select u from Usuario u where u.id = :id", Usuario.class)
                    .setParameter("id", id)
                    .getSingleResult();
        } catch (NoResultException e) {
            return null;
        }
    }
}
<form action="${linkTo[UsuarioController].adiciona(null)}" method="post">
      <div class="form-group">
           <input type="hidden" name="usuario.id" value="${usuario.id }"/>
           <label for="nome">Nome do usuário</label>
            <input type="text" name="usuario.nome" id="nome" value="${usuario.nome}"/>

           <label for="email">E-mail do usuário</label>
           <input type="text" name="usuario.email" id="email" value="${usuario.email}"/>

            <label for="login">Login</label>
            <input type="text" name="usuario.login" id="login" value="${usuario.login}"/>

           <label for="senha">Senha</label>
           <input type="password" name="usuario.senha" id="senha"  value="${usuario.senha}"/>

           <input type="submit" class="btn btn-default botaoInserir" value="Salvar"/>                                                     
     </div>
</form>
<a href="${linkTo[UsuarioController].form()}" type="button" >Novo usuário</a>
<table >
    <thead>
        <tr>
            <th>Código</th>
            <th>Nome</th>
            <th>E-mail</th>
            <th>Login</th>
            <th>Editar</th>
        </tr>
    </thead>
    tbody>
        <c:forEach items="${usuarios}" var="u">
            <tr class="odd gradeX">
                <td>${u.id}</td>
                <td>${u.nome}</td>
                <td>${u.email }</td>
                <td>${u.login }</td>
                <td><a href="${linkTo[UsuarioController].editar}?id=${u.id}">Editar</a></td>
            </tr>
        </c:forEach>
    </tbody>
</table>
2 respostas

Oi Marciel!

Acredito que seu problema esteja no método adiciona(Usuario usuario) do seu DAO.

Ele deveria ser assim:

public void adiciona(Usuario usuario){
            if (usuario.getId() != null) {
                manager.getTransaction().begin();
                manager.merge(usuario);
                manager.getTransaction().commit();
            }else {
                manager.getTransaction().begin();
                manager.persist(usuario);
                manager.getTransaction().commit();
            }            
    }

a diferença é só no getId, se o id do seu usuario estiver null vc quer salvar um novo usuário no seu banco, caso contrário, vc quer dar o merge.

o problema acontece pq seu usuário nunca está null nesse ponto do código, então ele vai sempre salvar um novo em vez de atualizar o antigo.

abraços!

solução!

Olá Philippe!

Fiz a alteração que sugeriu, mas continuou sem trazer os valores.

Pesquisando mais, entrei a falha,era o meu método edita do UsuarioController, que estava com return... e não precisava... Também tirei o @IncludeParameters que não é pra esse tipo de método mesmo... então antes era assim:

@IncludeParameters    
    public Usuario editar(int id, Result result){
        Usuario usuarioEncontrado = usuarioDao.pegaPorId(id);
        result.of(this).form();
        result.include(usuarioEncontrado);
        return usuarioEncontrado;

agora é assim:

public void editar(int id, Result result){
        Usuario usuarioEncontrado = usuarioDao.pegaPorId(id);
        result.include(usuarioEncontrado);
        result.of(this).form();
    }

Valeu galera, abraço.