[VRaptor3] Redirecionar Erro 404 para meu ErrorController [Resolvido]

7 respostas
lscosta

Buenas!

Como faço para que um controller meu responda a erros 404?

Da forma que fiz, recebo uma página em branco… =P

Tentei isso:

web.xml

<error-page>
        <error-code>404</error-code>
        <location>/error/404</location>
</error-page>

ErrorController.java

@Resource
public class ErrorController {

	public ErrorController() {
	}
	
	@Path("/error/404")
	public void error404(){		
	}
}

Quero usar via controller em função de manter a decoração do Sitemesh e outros controles.

7 Respostas

G

Eu fiz um controller aproveitando a dica do Lavieri aqui: http://vraptor.caelum.com.br/cookbook/aceitando-urls-com-ou-sem-barra-no-final/

O que eu fiz foi alterar ele para quando não encontrar o controller seja enviado para um controller específico:

@Component
@RequestScoped
public class Custom404Handler
    extends DefaultResourceNotFoundHandler {
    private final Result result;

    public Custom404Handler(Result result) {
        this.result = result;
    }

    @Override
    public void couldntFind(RequestInfo requestInfo) {
        try {
            String uri = requestInfo.getRequestedUri();
            result.forwardTo(UserSpaceController.class).blocked();

        } catch (ResourceNotFoundException ex) {
            super.couldntFind(requestInfo);
        }
    }
}
lscosta

wow! massa!

Mudei um pouco, se houver alguma restrição favor avise!

@Component
@RequestScoped
public class Custom404Handler extends DefaultResourceNotFoundHandler {

	private final Result result;

	public Custom404Handler(Result result) {
		this.result = result;
	}

	@Override
	public void couldntFind(RequestInfo requestInfo) {
		result.use(Results.logic()).forwardTo(ErrorController.class).error404();
	}

}

Valeu garcia-jj!!

Lucas_Cavalcanti

assim funciona, mas vc não precisa extender o DefaultResourceNotFoundHandler… é só implementar a interface ResourceNotFoundHandler

[]'s

lscosta

yeap! :wink:

G

Só que tem um porém… como o vraptor é configurado no web.xml para interceptar tudo, e quando aparecer uma imagem? Por isso eu faço a chamada de super.couldntFind, assim ele faz o deferer para o container quando não é um controller.

Lucas_Cavalcanti

se for uma imagem (arquivos em geral), e ela existir, o vraptor nem faz nada… ele delega antes mesmo de começar o processo todo do VRaptor…

G

Hmm, eu tinha mesm dúvida quando ao processo de defering.

Valeu Lucas.

Criado 24 de fevereiro de 2010
Ultima resposta 24 de fev. de 2010
Respostas 7
Participantes 3