vRaptor: PathAnnotationRoutesParser

16 respostas
danieldestro

Para eu alterar o padrão da URI dos meus controllers, vi que devo apenas extender a classe PathAnnotationRoutesParser. Porém não parece ter funcionado.
Há alguma configuração extra?

package my.parser;

import br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;

@Component
@ApplicationScoped
public class AdminRoutesParser extends PathAnnotationRoutesParser {

	public AdminRoutesParser(Router router) {
		super(router);
	}

	protected String defaultUriFor(String controllerName, String methodName) {
		if( controllerName.endsWith("AdminController") ) {
			return "/admin/" + methodName + ".jsp";
		} else {
			return super.defaultUriFor(controllerName, methodName);
		}
    }
}

16 Respostas

Lucas_Cavalcanti

isso está sendo compilado junto com a sua aplicação, ou está dentro do jar?

coloca um breakpoint, ou um println nesse método pra ver se ele está sendo chamado mesmo

danieldestro

Mesmo projeto, mesmo diretório “src”.
Estou desenvolvendo no Eclipse para o Google App Engine (GAE) com o plugin.
Alguma restrição quanto ao GAE?
Em modo debug nem passa no breakpoint.

Lucas_Cavalcanti

sysout?

danieldestro

Nem mesmo o bom e velho sysout.
O vRaptor assume o novo PathAnnotationRoutesParser simplesmente pelas anotações (e o extends da classe)?

Lucas_Cavalcanti

sim

Lucas_Cavalcanti

dá um throw new RuntimeException() no construtor

danieldestro

[WARN] failed vraptor: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adminRoutesParser': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.refscall.web.admin.controller.AdminRoutesParser]: Constructor threw exception; nested exception is java.lang.RuntimeException: ERRO FORÇADO... [WARN] Failed startup of context com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@17918f0{/,/home/destro/java/workspace/Refscall/war} org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adminRoutesParser': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.refscall.web.admin.controller.AdminRoutesParser]: Constructor threw exception; nested exception is java.lang.RuntimeException: ERRO FORÇADO... at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:283) ... Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.refscall.web.admin.controller.AdminRoutesParser]: Constructor threw exception; nested exception is java.lang.RuntimeException: ERRO FORÇADO... at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141) ... Caused by: java.lang.RuntimeException: ERRO FORÇADO... at br.com.refscall.web.admin.controller.AdminRoutesParser.<init>(AdminRoutesParser.java:14) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ...

Lucas_Cavalcanti

então o VRaptor está usando a sua classe :wink:

faz o seguinte agora: sobrescreve o método rulesFor e joga uma exception. Se ele der a exception, é pq ele tá usando a sua classe

danieldestro

Deu exceção no startup:

[WARN] failed vraptor: java.lang.RuntimeException: ERRO NO método rulesFor [WARN] Failed startup of context com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@a53de4{/,/home/java/workspace/MyProject/war} java.lang.RuntimeException: ERRO NO método rulesFor at br.com.refscall.web.admin.controller.AdminRoutesParser.rulesFor(AdminRoutesParser.java:23) at br.com.caelum.vraptor.ioc.ResourceHandler.handle(ResourceHandler.java:48) at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.handleRefresh(StereotypedBeansRegistrar.java:59) at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.onApplicationEvent(StereotypedBeansRegistrar.java:46) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)

Vou providenciar outros testes.

Lucas_Cavalcanti

então o VRaptor está usando sua classe, precisa só mudar a lógica que vc colocou no método defaultUriFor…

vc pode habilitar o log de debug do vraptor e no final da inicialização ele vai te mostrar todas as rotas criadas.

danieldestro

Ele não entra de jeito nenhum no método defaultUriFor da minha classe.

Lucas_Cavalcanti

esse defaultUriFor não é chamado se vc usa @Path("…"), @Get("…"), @Post("…"), etc

danieldestro

Hummmm… então é isso. Então, como posso mudar o comportamento do vRaptor para usar um JSP diferente do padrão (convenção)?

Tenho a classe ProductAdminController e o método edit. Por padrão iria para WEB-INF/jsp/productAdmin/edit.jsp.

Quero que vá para WEB-INF/jsp/admin/product/edit.jsp

Lucas_Cavalcanti

não é o routesParser que vc tem que mudar, é o PathResolver:
http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/

o routesParser é o que gera as URIs, o pathResolver é o que gera o caminho dos jsps (ou qqer view que vc queira usar)

danieldestro

Opa, legal. Extender DefaultPathResolver resolveu meu problema. Valeu pela ajuda.
Aliás, poderiam incluir na documentação o fato de @Path e etc inibir o método citado acima.

Lucas_Cavalcanti

sim, a gente precisa melhorar bastante as documentações das extensões do VRaptor =(

Criado 28 de março de 2011
Ultima resposta 29 de mar. de 2011
Respostas 16
Participantes 2