Solução amigável para o erro 405 – Method not Allowed

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.