Problema no Redirect usando Vraptor 3.0.1 e o OC4J 10.1.3.1

Pessoal,

Estamos usando aqui o VRaptor 3.0.1, desenvolvendo uma aplicação utilizando o OC4J 10.1.3.1.Para demonstrar o erro, utilizando o vraptor-blank-project, apenas adicionei as seguintes linhas no index controller.

	@Path("/index")
	public void index() {
	}
	
	@Get	
	@Path("/redirect")
	public void redirect()
	{
		result.use(Results.logic()).redirectTo(IndexController.class).index();
	}

Ao acessar “/redirect”, com a aplicação deployada no OC4J eu tenho um erro 500 causado por uma java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;

O log inteiro pode ser visto em: http://pastie.org/667104.txt

Quando faço o deploy da mesma aplicação no Tomcat 6, o erro não acontece e o redirect funciona normalmente.

Alguém já teve algum tipo de erro assim? :frowning:

Valeu pessoal!

Ola Pellegrino!

O VRaptor 3 foi feito usando servlet 2.5 e usamos o context.getContextPath, que so entrou no servlet 2.5. Basta voce mudar o componentes para request.getContextPath. Alias, se funcionar, e forem poucos pontos de mudanca para que o Vraptor funcione com 2.4, vamos fazer isso!

Crie uma classe que extends DefaultLogicResult para reescrever o metodo redirectTo da seguinte maneira:

@Component
public class PellegrinoLogicResult extnds DefaultLogicResult{
  public PellegrinoLogicResult(Proxifier proxifier, Router router, ServletContext context, MutableRequest request,
            HttpServletResponse response, TypeCreator creator, Container container, PathResolver resolver) {

     /// chama o super tambem!!! ja que ta privado

        this.proxifier = proxifier;
        this.response = response;
        this.context = context;
        this.request = request;
        this.router = router;
		this.creator = creator;
		this.container = container;
		this.resolver = resolver;
    }

    public <T> T redirectTo(final Class<T> type) {
        return proxifier.proxify(type, new MethodInvocation<T>() {
            public Object intercept(T proxy, Method method, Object[] args, SuperMethod superMethod) {
            	if (!acceptsHttpGet(method)) {
            		throw new IllegalArgumentException("Your logic method must accept HTTP GET method if you want to redirect to it");
            	}
                try {
                    String path = request.getContextPath();
                    String url = router.urlFor(type, method, args);
                    includeParametersInFlash(type, method, args);
                    response.sendRedirect(path + url);
                    return null;
                } catch (IOException e) {
                    throw new ProxyInvocationException(e);
                }
            }

        });
    }

talvez voce tenha de copiar metodos privados. codigo aqui:

da um feedback pra gente?

abraços

Valeu Paulo!

Funcionou tudo ok aqui!

Coloquei o código neste gist aqui: http://gist.github.com/218640

Valeu! :slight_smile:

Paulo,

Comecei a testar o VRaptor usando Servlet 2.3 (OC4J 10.1.2.3.0) e acabei conseguindo rodar usando o Pico Container, porém não testei todos os recursos, apenas rodei o vraptor-blank.

Você conhece algum relato parecido? É muita viagem minha tentar isso?

Valeu!

Estou com o mesmo problema porem estou utilizando o Vraptor 3.4.0 e o mesmo não possui a classe br.com.caelum.vraptor.http.TypeCreator utilizada na classe criada pelo pellegrino (http://gist.github.com/218640) o que pode ser feito para que ela funcione na versão 3.4.0 do Vraptor.

People …!!!

Resolvi essa situação agora assim:

método de origem:

[code]UsuarioController{

@Get
@Post

metodoGravarNovaSenha(Usuario usuario){
… gravarNoDao(usuario)…

 this.result.redirectTo(IndexController.class).autenticarLogin(usuario);

}

}[/code]

método de destino:

[code]UsuarioController{

@Get
@Post

autenticarLogin(Usuario usuario){
… autenticarNoDao(usuario)…
…paginaMainFrame()…

}

}[/code]

[b]Percebam que o problema se relaciona quanto ao método do form (GET/POST) então … nestes termos … resolvi somente assinando o método do controller com os 2 tipos de métodos.

Abraços[/b]