Problema na validação com vraptor 3

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. :frowning:

Vou mostrar o método do meu controller, se alguém já passou por isso e conseguiu resolver, ficaria grato :slight_smile:

    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");
    }

se vc tá com a última versão do vraptor vc não precisa fazer esse código:

  if(validator.hasErrors()) {  
         result.include("usuario", usuario);  
         validator.onErrorUse(page()).of(UsuarioController.class).formAlterarSenha();  
     }  

faça apenas

validator.onErrorUse(page()).of(UsuarioController.class).formAlterarSenha();

que deve funcionar…

outra coisa: não faça

result.forwardTo("/WEB-INF/jsp/usuario/inicio.jsp");

use algo como:

result.of(UsuarioController.class).inicio();

que faz a mesma coisa que a linha acima (não vai executar a lógica, vai só pra jsp…

se o método alterarSenha estiver já na classe UsuarioController, vc pode fazer ainda melhor:

result.of(this).inicio();

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 :frowning:

    //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 problema está nessa linha:

 usuario = dao.getById(usuario.getId());

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 :slight_smile: 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.

é isto mesmo, agora tudo faz sentido.

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 :frowning:

Mas depois eu vou fuçar no vraptor pra ver pq ele não tá aceitando o include.

bom, isso deveria estar funcionando, vou dar uma olhada por aqui também, e ver se tudo funciona…