Routes Configuration

9 respostas
fahecon

Dae pessoal.

Bem… andei dando uma sondada na documentação do VRaptor 3 e descobri que ele oferece um recurso que permite a criação de rotas genéricas em tempo de execução, mas infelizmente a documentação está muito enxuta. Alguém teria mais alguma informação a respeito?

Abraço,

[ ]'s
Fábio Heleno

9 Respostas

Lucas_Cavalcanti

Olá fahecon,

sim, a documentação sobre isso é bem pequena… =(
tudo o que tem está no final dessa página da documentação:
http://vraptor.caelum.com.br/documentacao/resources-rest/

mas nessa parte está praticamente tudo o que você pode usar…
tente navegar nos métodos possíveis a partir do
routeFor("/…/…")

você pode colocar variáveis (templates) nas URIs, bastando
colocá-las entre chaves ({}), você pode adicionar restrições via espressões regulares com withParameter(…).matching(regex), e adicionar prioridades pras rotas com o withPriority… trocar o HTTP method com with(HttpMethod)

não tem muita documentação sobre isso, pq a gente não quer que
você precise usar essa classe, a anotação @Path no método deveria ser suficiente…

tem algo que você queira fazer que não está na documentação, ou não dá pra fazer com o @Path?

[]'s

fahecon

Porque minha idéia é trabalhar sobre um único controller genérico, onde todas as outras especialistas a herdaram e se necessário, uma sobrecarga de um método nessa Classe especialista resolveria.

Mas ai entra a questão das rotas, como deixar as rotas genéricas também? A ponto de dinamicamente ter a mesma flexibilidade.

Não sei se fui muito claro.

[ ]'s
Fábio Heleno

Lucas_Cavalcanti

se o que você quer dizer com rotas genéricas, é sobrescrever a convenção de URIs do VRaptor ( /<controller_name>/ ), você pode criar a seguinte classe:

@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {
    //delegate constructor
    protected String extractControllerNameFrom(Class<?> type) {
        return //sua convenção aqui
    }

     protected String defaultUriFor(String controllerName, String methodName) {
        return //sua convenção aqui
    }
}

Não precisa configurar nada em lugar nenhum, é só criar essa classe…

isso é suficiente? se não for, você pode falar o caso em que isso não funciona?

[]'s

fahecon

Opa Lucascs.

Até entendi o escorpo, mas não a aplicabilidade disso.. na pratica não consegui visualizar... até tentei implementar, vejo que a classe é chamada quando o projeto é iniciado, mas após inicio da aplicação não ocorre mais nenhuma chamada a esta classe.

Fora que minha aplicação parou de funcionar quando ponho essa classe rodando.

@Resource
public class IndexController {

    public void index() {
        //....
    }

    public void list() {
        //....
    }
}
@Component
@ApplicationScoped
public class MeuRoutesParser extends PathAnnotationRoutesParser {

    public MeuRoutesParser(Proxifier proxifier, TypeFinder finder) {
        super(proxifier, finder);
    }

    @Override
    protected String extractControllerNameFrom(Class<?> type) {
        return null; //sua convenção aqui
    }

    @Override
    protected String defaultUriFor(String controllerName, String methodName) {
        return null; //sua convenção aqui
    }

}
O erro
15/10/2009 15:18:52 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
java.lang.NullPointerException
        at br.com.caelum.vraptor.http.route.RouteBuilder.<init>(RouteBuilder.java:93)
        at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.registerRulesFor(PathAnnotationRoutesParser.java:81)
        at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.rulesFor(PathAnnotationRoutesParser.java:70)
        at br.com.caelum.vraptor.http.route.DefaultRouter.register(DefaultRouter.java:112)
        at br.com.caelum.vraptor.ioc.ResourceHandler.handle(ResourceHandler.java:44)
        at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.handleRefresh(StereotypedBeansRegistrar.java:59)
        at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.onApplicationEvent(StereotypedBeansRegistrar.java:47)
        at org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicationEventMulticaster.java:78)
        at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:76)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:275)
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:737)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:384)
        at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:66)
        at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:77)
        at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
        at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:96)
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
        at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:516)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
        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:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

Qual procedimento estaria faltando adotar para que isso funcione?

[ ]'s

Fábio Heleno

G

fahecon:

Qual procedimento estaria faltando adotar para que isso funcione?

[ ]'s

Fábio Heleno

Você deve implementar sua lógica onde possui os comentários //sua convenção aqui

fahecon

Pois é Garcia, mas não há nada na documentação que me diga quais as possibildiades de trabalho nesta classe, nenhuma referencia… dai fica dificil ficar aqui na base do chutometro.

Mas é exatamente o ponto que você levantou é o que preciso de esclarecimentos… preciso compreender melhor a execução disto.

[ ]'s
Fábio Heleno

G

fahecon:
Pois é Garcia, mas não há nada na documentação que me diga quais as possibildiades de trabalho nesta classe, nenhuma referencia… dai fica dificil ficar aqui na base do chutometro.

Mas é exatamente o ponto que você levantou é o que preciso de esclarecimentos… preciso compreender melhor a execução disto.

[ ]'s
Fábio Heleno

Fábio, a documentação ainda está clean. Por enquanto eu estou analisando os fontes dos componentes e assim criando meus componentes com base nesses. Por exemplo, semana passada fiz um TilesPathResolver, então me baseei no que está padrão no vraptor. Os códigos me pareceram muito simples de entender, bem documentado via javadoc, além de bem intuitivos.

Uma coisa que acho interessante, já que a doc está curta ainda, é trocarmos as nossas idéias aqui e aos poucos enviando essas sugestões e até mesmo textos nossos para incluir na documentação. Eu estou com uma série de componentes e afins que fiz, e quero assim que conseguir documentar enviar para análise do pessoal do vraptor.

Abraços

Lucas_Cavalcanti

Bom… isso está na documentação:
http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/

bom, pra ficar mais claro… a convenção para URIs é:

/<controller_name>/<method_name>

se você quiser mudar a convenção do controller_name, você sobrescreve o método extractControllerName e retorna qual é a convenção. por exemplo se vc quiser remover o sufixo “Logic”:

@Override
protected String extractControllerNameFrom(Class<?> type) {
        return type.getSimpleName().replace("Logic", "");
    }

se você quiser sobrescrever a convenção /<controller_name>/<method_name> para /<controller_name>.<method_name>.logic é só sobrescrever o método defaultUriFor:

@Override
protected String defaultUriFor(String controllerName, String methodName) {
        return "/" + controllerName + "." + methodName + ".logic
    }

Entendeu?

G

lucascs:
Bom… isso está na documentação:
http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/

:oops: Passou despercebido.

Criado 14 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 9
Participantes 3