Minha dúvida é: Como lançar erros 404, 403 via código, em um Interceptor, no VRaptor.
Eu estou tentando usar o método do HttpServletResponse:
try {
this.response.sendError(HttpServletResponse.SC_FORBIDDEN);
} catch (IOException e) {
e.printStackTrace();
}
Consegui descobrir o problema:
Depois de chamar o sendError, eu não posso chamar o método next de InterceptorStack.
Eu acho que é isso.
if (userAllowed) {
arg0.next(arg1, arg2);
} else {
try {
this.response.sendError(HttpServletResponse.SC_FORBIDDEN);
} catch (IOException e) {
e.printStackTrace();
}
}
depois de mandar o erro vc não pode mesmo continuar com o stack…
ao invés de usar o response diretamente vc pode fazer:
result.use(Results.status())...
//ou
result.use(Results.http()).sendError(...);
isso, se não já tiver no status()
Fala Lucas!
Eu estou usando o validator.onErrorSendBadRequest() que serializa as mensagens de erros armazenadas no validator.
Só que é o seguinte, eu quero poder fazer isso:
if(naoTaAutorizado){
result.use(Results.http()).setStatusCode(403);
validator.add(new ValidationMessage("O usuário não está autorizado a realizar essa operação", "HTTP 403"));
}
validator.onErrorSendBadRequest();
A mensagem é serializada normal, mas eu tb queria que a resposta de erro http fosse 403, mas a resposta de erro http retornada é a 400.
Dá um help?
vc quer as validações serializadas com o status 403?
if(naoTaAutorizado){
result.use(Results.http()).sendError(403, "O usuário não está autorizado a realizar essa operação");
return;
}
em todo caso, esse tipo de código não deveria estar num controller, e sim num interceptor.
Fala Lucas, beleza?
Então, eu havia pensado nessa forma também, só que quando eu uso o sendError o VRaptor vai tentar redirecionar você para a página 403 certo? Eu uso ele no meu interceptor sim, mas nesse caso só vai funcionar quando o cliente da aplicação é o browser. Eu queria uma resposta REST, com o código http 403 e uma mensagem serializada no corpo do http.
então troque por:
result.use(Results.http()).setStatusCode(403);
result.use(Results.representation).from(new ValidationMessage("O usuário não está autorizado a realizar essa operação", "HTTP 403")).serialize();
return;
Era exatamente isso que eu queria! Valeu Lucas! Por isso que eu amo o VRaptor!
Lucas, sem querer ser chato, mas como eu faria para serializar os erros do validator de maneira identica ao realizado pelo validator.onErrorSendBadRequest() ? É porque o meu cliente javascript espera receber a mensagem de erro no mesmo padrão do validator.onErrorSendBadRequest()
Aê Lucas, conseguir fazer aqui:
result.use(Results.http()).setStatusCode(403);
validator.add(new ValidationMessage("O usuário não está autorizado a realizar essa operação", "HTTP 403"));
validator.onErrorUse(Results.json()).from(validator.getErrors(), "errors").serialize();
Funcionou certinho! Valeu!!
É possível serializar um código 404??