vRaptor: PathAnnotationRoutesParser

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?

[code]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);
	}
}

}
[/code]

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

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.

sysout?

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

sim

dá um throw new RuntimeException() no construtor

[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) ...

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

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.

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.

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

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

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

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)

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.

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