Lançar erros 404, 403, etc via código com o VRaptor

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(...);

Ficaria assim?

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??