Olá pessoal,
Recentemente eu postei um tópico querendo saber como eu configurava uma url para erro 404. O problema é que o Vraptor só permite tratar erros 404 com páginas estáticas. Quando a gente coloca uma url que vai ser tratada por um controller, não funciona. O tópico em questão era esse aqui: http://www.guj.com.br/java/304932-pagina-de-erro-personalizada-no-vraptor#1621778
Eu dei uma olhada no código do Vraptor e encontrei o problema. Acredito ser um bug. Quando a gente acessa uma url que não existe, o filtro do Vraptor é acionado 2 vezes: a primeira acontece por conta do dispatcher REQUEST e a segunda por conta do dispatcher ERROR. Nessa segunda vez, a requisição que chega no filtro está procurando pela URL configurada no web.xml.
O problema é que, quando o fluxo de execução chega na classe DefaultResourceTranslator, a requisição está procurando pela URL que não existe. Em algum momento ocorre essa mudança e acredito que isso seja um erro.
Para reproduzir o erro, coloque a seguinte configuração no web.xml:
<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>
Além disso, adicione o dispatcher de ERROR no filter-mapping.
Depois coloque um breakpoint na linha 93 da classe VRaptor e na linha 48 da classe DefaultResourceTranslator. Inicie o servidor e tente acessar uma URL inválida. Quando passar a primeira vez pelos breakpoints, pode pular, pois são referentes ao dispatcher REQUEST. Na segunda vez que passar pelos breakpoints, inspecione a instância de RequestInfo e perceba que a requisição mudou de um momento pro outro.
Só pra testar, eu coloquei o seguinte trecho de código na classe DefaultResourceTranslator:
if(info.getRequest().getDispatcherType().equals(DispatcherType.ERROR)) {
resourceName = "/404";
}
E funcionou… O problema é que eu não consegui resolver o problema na raiz… Não era pra chegar uma outra requisição aí. Seria um bug de fato? Se sim, como posso resolvê-lo?


