Boa tarde a todos,
Quando anotamos as URLs do nosso sistema com @Path, @Get, @Post, definimos as formas de acesso a estas URLs. Quando mapeio um endereço com @Path, o VRaptor permite o acesso ao endereço tanto por GET como por POST, quando usamos @Post somente por POST e @Get somente por GET.
Quando um usuário ou recurso tenta acessar este endereço com um método não esperado, é gerada uma exception que para toda a sua aplicação, esta com o código 405, ou a MethodNotAllowedException. Para o usuário isso não é viável, logo porque pode deixá-lo frustrado ou mostrar qual a tecnologia utilizada na sua aplicação.
O que fazer ?
Podemos criar um componente com escopo de requisição (request) que intercepta as chamadas as URIs da aplicação e caso seja chamado o método ‘deny’ da interface MethodNotAllowedHandler, podemos definir uma determinada ação.
[java]
package vraptor.route;
import java.util.Set;
import app.controllers.HomeController;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.RequestInfo;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.HttpMethod;
import br.com.caelum.vraptor.resource.MethodNotAllowedHandler;
@Component
@RequestScoped
public class Erro405 implements MethodNotAllowedHandler
{
private Result result;
public Erro405(Result result)
{
this.result = result;
}
@Override
public void deny(RequestInfo requestInfo, Set<;HttpMethod> httpMethods)
{
// URI mapeada por nome e não programática.
result.redirectTo(“/endereco-da-minha-url/”);
// ou para uma lógica direta.
result.redirectTo(HomeController.class).index();
}
}
[/java]
Assim, com o uso de injeção de dependências do container em uso (Spring, Pico, Guice) posso incluir recursos nesta classe para realizar N operações como por exemplo log em banco, armazenar uma mensagem em sessão, etc.
Referências
http://vraptor.caelum.com.br/documentacao/interceptadores/
http://vraptor.caelum.com.br/cookbook/aceitando-urls-com-ou-sem-barra-no-final/
Até a próxima.