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 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:
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?
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.
[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.