Estou tendo um problema com validação com vraptor, especificamente neste método quando eu provoco um erro, ele redireciona para a página desejada, mas os dados não vão.
Era pra ele exibir os dados do usuário de novo no formulário, mas ele não exibe, é como se o result.include(“usuario”, usuario); que eu dei não tivesse fazendo efeito algum.
Vou mostrar o método do meu controller, se alguém já passou por isso e conseguiu resolver, ficaria grato
public void alterarSenha(Usuario usuario, String novaSenha, String confirmacaoNovaSenha) {
String senhaAnterior = usuario.getSenha();
usuario = dao.getById(usuario.getId());
if(!HashUtil.SHA(senhaAnterior).equals(usuario.getSenha()))
validator.add(new ValidationMessage("A senha atual e a anterior não conferem!", "error"));
if(novaSenha.equals(""))
validator.add(new ValidationMessage("A valor do campo nova senha não foi preenchido", "error"));
if(!novaSenha.equals(confirmacaoNovaSenha))
validator.add(new ValidationMessage("Os valores da nova senha e da confirmação da nova senha precisam ser iguais.", "error"));
if(novaSenha.length() < 6)
validator.add(new ValidationMessage("A senha precisa ter no mínimo 6 caracteres", "error"));
if(validator.hasErrors()) {
result.include("usuario", usuario);
validator.onErrorUse(page()).of(UsuarioController.class).formAlterarSenha();
}
usuario.setSenha(HashUtil.SHA(novaSenha));
dao.update(usuario);
result.include("message", "Senha alterada com sucesso.");
result.forwardTo("/WEB-INF/jsp/usuario/inicio.jsp");
}
Valeu pelas dicas, eu mudei o código mas ainda tá dando o mesmo problema, quando eu chamo:
mas quando acontece erro ele não passa o valor do usuário de volta para a view
//FIXME a parte de validação deste método está quebrada.
public void alterarSenha(Usuario usuario, String novaSenha, String confirmacaoNovaSenha) {
String senhaAnterior = usuario.getSenha();
usuario = dao.getById(usuario.getId());
if(!HashUtil.SHA(senhaAnterior).equals(usuario.getSenha()))
validator.add(new ValidationMessage("A senha atual e a anterior não conferem!", "error"));
if(novaSenha.equals(""))
validator.add(new ValidationMessage("A valor do campo nova senha não foi preenchido", "error"));
if(!novaSenha.equals(confirmacaoNovaSenha))
validator.add(new ValidationMessage("Os valores da nova senha e da confirmação da nova senha precisam ser iguais.", "error"));
if(novaSenha.length() < 6)
validator.add(new ValidationMessage("A senha precisa ter no mínimo 6 caracteres", "error"));
result.include("usuario", usuario);
validator.onErrorUse(page()).of(UsuarioController.class).formAlterarSenha();
usuario.setSenha(HashUtil.SHA(novaSenha));
dao.update(usuario);
result.include("message", "Senha alterada com sucesso.");
result.forwardTo(this).inicio(null);
//result.forwardTo("/WEB-INF/jsp/usuario/inicio.jsp");
}
o vraptor replica só os parâmetros que vieram na requisição… vc está puxando todos os dados do usuário pelo banco pra mostrar na tela, então vai ter que dar o result.include mesmo…
na linha 15 eu tô dando o result.include mesmo assm não tá vindo.
Mas faz sentido oq você falou, que ele só retorna os parâmetros que vieram na requisição, pois o usuario.id está vindo na view, só o resto dos dados do usuário não estão vindo, pois não foram mandados pela requisição.
Solução, vou ter que fazer campos hidden na view antes de mandar para a validação, é meio contra-mão, mas é o jeito.
Era oq eu pensava, quando eu coloquei o campo hidden na view com o valor do nome do usuário ele retornou o nome, pois tinha vindo na requisição junto com o id do usuário.
Eu achei meio esquisito o result.include não pegar, fica um pouco estranho eu ter que fazer campos hiddens na view.
Porque eu não tinha este problema antes? pq eu passava os dados via formulário, nos inputs da vida ou nos selects.
Agora como eu só preciso de mudar as senhas, então eu coloquei os outros dados do usuário somente para exibição, fora dos inputs. Logo quando dá erro, ele só retorna os dados que estavam no formulário, por exemplo o usuário.id, e não retorna os dados que estavam fora do formulário, tenho algumas alternativas, mudo o framework, coloco os dados de exibição em inputs text e deixo eles desativados ou faço vários input hidden pra ele poder mandar pela requisição.
Tenho que entregar o projeto até segunda logo, eu vou colocar hidden mesmo
Mas depois eu vou fuçar no vraptor pra ver pq ele não tá aceitando o include.