Questão VRaptor Validator (Resolvido)

Prezados estou achando uma coisa estranha no VRaptor 3.
Se alguém puder me explicar, ajudar, eu agradeço.

O meu código é o seguinte:

if(listaUsuario.size() != 0){
				//código de sucesso!
			}//fim if
			else{
				validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
			}//fim else
			validator.onErrorUsePageOf(LoginController.class).index();
			result.redirectTo(AssuntoController.class).chat();

Só que quando adiciono o erro eu redireciono para a mesma página, de login:

E na página tem as tags:

<c:forEach var="error" items="${errors}">
   ${error.message}<br />
&lt;/c:forEach&gt;

Até aí tudo bem. Quando ele volta pra página com erro adicionado. Ele mostra o erro na página, perfeito!

Mas mesmo assim ele gera exceção quando passa pela linha: validator.onErrorUsePageOf(LoginController.class).index();

Gostaria de não ficar gerando exceção que não me ajuda.
Alguém sabe porque ele gera esse erro?

PS: Preciso redirecionar para a mesma página e não para uma página de erro especifica.

Grato!

Segue o erro:

qual versão do VRaptor?

PS: sério que vc coloca comentários em todos os }? o.0

Rsrs. Eu sou muito metódico cara!!

Eu to usando a versão 3, VRaptor3.

Eu inda não tentei jogar para uma outra página. Mas não é isso que eu queria. Tinha que aparecer o erro na mesma página.

qual versão 3? 3.3.1? 3.2.0?

ele tá passando pela linha do validator.onErrorUse…?

3.3.1

Com certeza! É nessa linha mesmo que dá erro.

Debugando:

        else{
        	validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
        }//fim else
        validator.onErrorUsePageOf(LoginController.class).index();
        result.redirectTo(AssuntoController.class).chat();

ele entra no else.
Passa na linha

validator.add(new ValidationMessage("Login ou senha inválidos","erro"));

depois vai para a linha:

validator.onErrorUsePageOf(LoginController.class).index();

e aí dá br.com.caelum.vraptor.InterceptionException.
e entra no catch.

try{
	//Código
	if(listaUsuario.size() != 0){
		//Código
	}//fim if
	else{
		validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
	}//fim else
		validator.onErrorUsePageOf(LoginController.class).index();
		result.redirectTo(AssuntoController.class).chat();
	}//fim try
	catch(Exception e){
		e.printStackTrace();
	}//fim catch

tire o try…catch exception!

a linha validator.onErrorUsePageOf(LoginController.class).index(); lança uma exceção caso hajam erros, e o VRaptor usa isso pra fazer a validação. Como vc fez o try…catch e ignorou a exceção vc quebrou o comportamento do VRaptor.

uhm… Valeu!! É isso mesmo.
Achei isso meio estranho.
Quer dizer que se eu fizer um bloco try/catch e depois colocar validator.onErrorUsePageOf…
e quiser fazer outra coisa caso não dê erro. Eu vou ter que abrir outro try/catch pra colocar outro código.

Tipo assim:


try{
			if(listaUsuario.size() != 0){
				usuario = listaUsuario.get(0);
				session.setAttribute("usuario", usuario);
				global.getUsuariosOnline().add(usuario);
				entityManager.close();
			}//fim if
			else{
				validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
			}//fim else
		}//fim try
		catch(Exception e){
			e.printStackTrace();
		}//fim catch
		validator.onErrorUsePageOf(LoginController.class).index();
                try{
                   //mais código que eu gostaria de executar se não houver erro
                }
                catch(Excption e){
                }
		result.redirectTo(AssuntoController.class).chat();

É isso?

Como se não houver erro adicionado ele não gera aquela exceção eu prefiro colocar tudo em um try/catch mesmo. Essa exceção não tem tanto problema.

pra quê colocar esses try…catch’s?
ignorar todas as exceções é a pior coisa que vc pode fazer na sua aplicação.

não sei onde vc aprendeu isso, mas te ensinaram errado.

Deixa a exceção rolar, daí pelo menos vc vai saber que tem algo errado e vc pode se recuperar de algum jeito.

Que isso cara!
Essa página é de requisição. Se eu não tratar erro eu vou jogar erro na tela pro usuário ver stackTrace.

E em outras partes da aplicação o try/catch ajuda se eu quiser tratar erro. Dar um rollback por exemplo.

O fato do VRaptor3 criar essa exceção não tem problema. Mesmo porque, na prática não muda nada.
Só não entendi porque ele gera essa exceção.

br.com.caelum.vraptor.validator.ValidationException

na boa, você deveria aprender mais sobre desenvolvimento java pra web…

se você não quer que o usuário veja a sua stacktrace, vc customiza a página de erro do servidor. Vc faz isso com uma configuração no web.xml (procure por error-page)

esconder o erro no código é ERRADO.

try {

} catch (Exception e) {
   //nada ou só o e.printStacktrace
}

é a pior coisa que você pode fazer na aplicação.

se vc vai colocar alguma coisa no catch, tudo bem, mas ignorá-lo é ERRADO.

você vai criar uma fonte infinita de bugs na sua aplicação.

resumindo: try…catch não é errado, mas ignorar a exception é.

desculpe o tom agressivo, mas é justamente pra chamar a sua atenção.

o VRaptor lança ValidationException pois qdo dá erro de validação vc não quer que execute o resto da sua lógica. E ele usa a validation exception para fazer o redirect que vc configurou

É conheço.
Bem, se você escreve suas aplicações sem try/catch tudo bem.

Os códigos que eu postei eu escrivi agora. Não é de uma aplicação de verdade é só pra teste.

não me leve a mal, mas eu já perdi 2 dias tentando resolver um bug misterioso numa aplicação, e a causa dele era um try…catch vazio. Ou seja, aprendi que isso é ruim do jeito ruim.

Ta certo cara!
O nome já diz, “catch”.
Se você vai capturar o erro pra não fazer nada com ele. É melhor não ter.