Problema startup aplicação - VRaptor 3.5 + SACI

Olá.

Resolvi atualizar o VRaptor num sistema em que estou trabalhando.
Nele utilizo o SACI para controle de acesso.

Porém, ao atualizar o pom para a última versão do VRaptor, não consigo mais subir a aplicação. Recebo o seguinte erro:

 INFO [main] (LinkToHandler.java:54) - Registering linkTo component
May 12, 2013 1:11:29 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
br.com.caelum.vraptor.http.route.RouteNotFoundException: The selected route is invalid for redirection: br.com.xpto.backoffice.controller.LoginController.login
	at br.com.caelum.vraptor.http.route.DefaultRouter.urlFor(DefaultRouter.java:141)
	at net.diegomaia.vraptor.saci.component.startup.PageHandler.definePagesURLs(PageHandler.java:77)
	at net.diegomaia.vraptor.saci.component.startup.PageHandler.handle(PageHandler.java:68)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.executeStereotypeHandlers(GuiceProvider.java:109)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:98)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4071)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4725)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
	at org.apache.catalina.core.StandardService.start(StandardService.java:525)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

Esse erro ocorre quando o SACI, no start da aplicação, tenta resolver os caminhos das páginas de login e acesso negado.

Se nenhum método for especificado como sendo o da tela de login (nenhum método anotado com @LoginPage), works like a charm!

Mas quando anoto o devido método com @LoginPage, a zica volta.

Dei uma olhada na classe br.com.caelum.vraptor.http.route.DefaultRouter:

	public <T> String urlFor(Class<T> type, Method method, Object... params) {
		Iterator<Route> matches = Iterators.filter(routes.iterator(), Filters.canHandle(type, method));
		if (matches.hasNext()) {
			try {
				return matches.next().urlFor(type, method, params);
			} catch (Exception e) {
				throw new VRaptorException("The selected route is invalid for redirection: " + type.getName() + "."
						+ method.getName(), e);
			}
		}
		throw new RouteNotFoundException("The selected route is invalid for redirection: " + type.getName() + "."
				+ method.getName());
	}

Tentei debugar e ver o que tava rolando, mas não consegui. O debugger se perdia nos proxies gerados pelo guice.
O máximo que consegui foram uns “CTRL+CLICKs” pra tentar entender o fluxo.

Pelo que entendi, a exceção é lançada se não houver uma rota para o método em questão. Mas existe!
Acho que o VRaptor mudou a ordem em que processa as coisas. Deve estar chamando o PageHandler antes de obter as rotas, e por isso se perde.

Alguém saberia me dizer se é isso mesmo?

Sendo isso ou não, sabem me dizer o que fazer para contornar o problema?

Por ora, me resta voltar para a 3.4.1…=/

Olhando os logs do start da aplicação na versão 3.4.1, tive a sensação de que esse de fato é o problema (ordem de execução das coisas):

 INFO [main] (LinkToHandler.java:50) - Registering linkTo component
 INFO [main] (DefaultRouteBuilder.java:189) - /login                                            [GET] -> LoginController.login()
 INFO [main] (DefaultRouteBuilder.java:189) - /login                                            [POST] -> LoginController.login(Usuario)
 INFO [main] (DefaultRouteBuilder.java:189) - /sair                                             [GET] -> LoginController.logout()
 INFO [main] (PageHandler.java:77) - Login page >> /login
 INFO [main] (PageHandler.java:78) - Login page >> /login
 INFO [main] (DefaultRouteBuilder.java:189) - /dashboard                                    [ALL] -> DashboardController.dashboard()
 INFO [main] (VRaptor.java:103) - VRaptor 3.4.1-SNAPSHOT successfuly initialized

Adicionando um @AccessDeniedPage no controller, fica bem claro como funciona no 3.4.1:

 INFO [main] (LinkToHandler.java:50) - Registering linkTo component
 INFO [main] (DefaultRouteBuilder.java:189) - /login                                            [GET] -> LoginController.login()
 INFO [main] (DefaultRouteBuilder.java:189) - /login                                            [POST] -> LoginController.login(Usuario)
 INFO [main] (DefaultRouteBuilder.java:189) - /sair                                             [GET] -> LoginController.logout()
 INFO [main] (PageHandler.java:77) - Login page >> /login
 INFO [main] (PageHandler.java:78) - Login page >> /login
 INFO [main] (DefaultRouteBuilder.java:189) - /dashboard                                    [ALL] -> DashboardController.dashboard()
 INFO [main] (DefaultRouteBuilder.java:189) - /teste                                            [GET] -> DashboardController.teste()
 INFO [main] (PageHandler.java:87) - Access denied page >> /teste
 INFO [main] (PageHandler.java:86) - Access denied page >> /teste
 INFO [main] (VRaptor.java:103) - VRaptor 3.4.1-SNAPSHOT successfuly initialized

Para cada controller encontrado pelo VRaptor, ele:

  • Resolve as rotas das actions (métodos públicos);
  • Delega a classe do controller para os handlers (implementações da interface StereotypeHandler).

Por isso que nas versões <= 3.4.1 não há problemas, pois quando chega no PageHandler, as actions já possuem as respectivas rotas mapeadas.

Enfim, se for isso mesmo, não vejo solução senão alterar esse comportamento no próprio VRaptor, dado que (aparentemente) não temos garantia nenhuma de que ao executarmos nossos handlers o framework já tenha obtido as informações necessárias para o processamento…=/

[]'s

não existe ordem de execução dos handlers em geral mesmo…

o que podemos fazer pra forçar a ordem é fazer o handler do SACI receber o ResourceHandler do VRaptor no construtor, assim ele é carregado antes.

Lucas,

Voltou a ter ordem de execução dos handlers no 3.5.1? Pq parece que nessa versão o SACI funciona (ainda não testei).

não lembro de ter mexido nisso…

Bronx, conseguiu solucionar o problema?? Testei o SACI no Vraptor 3.51 e obtenho o mesmo erro que você

Jun 19, 2013 8:19:22 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
br.com.caelum.vraptor.http.route.RouteNotFoundException: The selected route is invalid for redirection: br.com.mlc.IndexController.index
	at br.com.caelum.vraptor.http.route.DefaultRouter.urlFor(DefaultRouter.java:141)
	at net.diegomaia.vraptor.saci.component.startup.PageHandler.definePagesURLs(PageHandler.java:84)
	at net.diegomaia.vraptor.saci.component.startup.PageHandler.handle(PageHandler.java:75)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.executeStereotypeHandlers(GuiceProvider.java:109)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:98)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4746)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5399)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Segui a sugestão do Lucas, alterei o SACI para receber o ResourceHandler no construtor do handler

public PageHandler (ResourceHandler resourceHandler, Router router, PageChecker pageChecker) 

mas o erro persiste…

Estou usando o vraptor 3.5.1, o projeto foi criado com base no vraptor-blank-project-3.5.1…

Lucas tem mais alguma sugestão para que o SACI funcione no vraptor 3.5.1??

Bronx, Parabéns pelo SACI!

[]'s

Oi src.andre.luis,

Vou soltar uma nova versão para resolver isso essa semana.

Se quiser contribuir, faça o fork (acho que já fez…hehe) e vamos conversando. Ja sei o que devemos fazer pra resolver isso.

Abç

Ola Bronx!!!

Acredito que não tenha necessidade para o fork, ja que meu problema e o seu problema são o mesmo.

E você parece ter descoberto a solução, eu fico no aguardo!!

Bronx, eu encontrei o link seu que, acredito eu, continha exemplos, tutoriais sobre o SACI, mas hoje esse link (http://dev.diegomaia.net/), parece não estar mais disponível! Tem algum lugar onde consigo encontrar informações sobre o SACI?!

Vlw

Pois é, bicho… Perdi esse server…

Mas tem um how to lá no github. http://github.com/bronx

Putz…

Decorrei o how to do github!! haha

Melhor que ler é testar!!

Fica aguardando a tua atualização!!

Vlw pela atenção Bronx.

Ola!!!

Alguma novidade sobre o SACI voltar funcionar no vraptor?

Ou alguma ideia do que é necessario para que ele funcione no vraptor?

Alguem tem alguma ideia do que possa ser feito para que o Saci funcione com o vraptor?..

Boa tarde, gostaria de saber se este problema já foi solucionado?
Obrigado

Ola!
Sim o problema foi resolvido. Lembrando que estamos falando do Vraptor 3.5.

E o SACI continua disponível no github do seu autor.
(https://github.com/bronx/SACI-VRaptor)

Vlw!

Boa tarde, estou tendo esse erro quando atualizei da versão 3.4.1 para 3.5.3
Será que pode ser outra coisa então?

Grave: Exception starting filter vraptor br.com.caelum.vraptor.http.route.RouteNotFoundException: The selected route is invalid for redirection: br.com.jornaljogoserio.controller.IndexController.login at br.com.caelum.vraptor.http.route.DefaultRouter.urlFor(DefaultRouter.java:146) at br.com.bronx.vraptor.saci.component.startup.PageHandler.definePagesURLs(PageHandler.java:76) at br.com.bronx.vraptor.saci.component.startup.PageHandler.handle(PageHandler.java:67) at br.com.caelum.vraptor.ioc.guice.GuiceProvider.executeStereotypeHandlers(GuiceProvider.java:109) at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:98) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:119) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:113) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4797) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5473) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:634) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:671) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:548) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1649) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1447) at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:862) at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:358) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:611) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)