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>