Prioridades de rotas no Vraptor3

4 respostas
G

Fiquei com uma dúvida de como o Vraptor processa a prioridade das rotas e também como ele “casa” o URI com determinada rota. Eu tenho uma action que possui a seguinte rota e assinatura:

@Get @Path( { "/customer/", "/customer/order-{order}/page-{page}/", "/customer/{letter}/order-{order}/page-{page}/", "/customer/page-{page}/", "/customer/{letter}/page-{page}/" }) void list(String letter, Paging paging, Order order);

Quando eu passo parametros que casem com /customer/page-{paging}/ o vraptor me passa o parametro {paging} sempre como null. Fiz um debug e notei isso nos logs:

FINE: trying to access /customer/page-10/ FINE: Setting paging with [10] FINE: found resource [DefaultResourceMethod: CustomerController.listCustomerController.list(String, Paging, Order)]

Coloquei um breakpoint no converter e ele está sendo chamado tudo certo, inicializando new Paging(14), porém quando chega no método list o valor de paging está nulo. Essa action funcionava corretamente quando as rotas eram apenas /customer/, /customer/page-{page}/, /customer/{letter}/page-{page}/. Quando adicionei /customer/order-{order}/page-{page}/ e /customer/{letter}/order-{order}/page-{page}/ deu esse erro.

Enfim, como eu posso colocar as prioridades dessas rotas para que eu possa ter os parametros passados corretamente? Será que nessas minhas rotas estou confundindo o vraptor a ponto dele tentar injetar o order ao invés do page?

4 Respostas

G

:oops:

Analisei com calma e meu converter que estava errado. Estava assim:

if (!Strings.isNullOrEmpty(value)) { return Paging.getInstance(); // create an empty paging }

Quando o correto deveria ser

if (Strings.isNullOrEmpty(value)) { return Paging.getInstance(); // create an empty paging }

Agora fazendo mais uns testes notei esse erro que é retornado quando tento acessar /customer/order-id/page-1/. Ou seja, penso que preciso alterar a ordem dessas rotas, pois nesse caso o vrator encontra rota duplicada.

java.lang.IllegalStateException: There are two rules that matches the uri '/customer/order-id/page-1/' with method GET: [[FixedMethodStrategy: /customer/order-{order}/page-{page}/ CustomerController.list(String, Page, Order) [GET]], [FixedMethodStrategy: /customer/{letter}/page-{page}/ CustomerController.list(String, Paging, Order) [GET]]] with same priority. Consider using @Path priority attribute.

Lucas_Cavalcanti

o problema é que letter captura qqer string… acho que não é isso que vc quer…

se vc colocar {letter:[a-zA-Z]} já deve funcionar

G

Pois é, achei que /customer/page-{page} seria diferente de /customer/letter-{letter}. Mudei para {letter:[A-Z]} mas segue o mesmo problema.

A prioridade quando eu uso um array no @Path.value é na sequencia da declaração?

Lucas_Cavalcanti

sim, é a sequência… é a ordem em que o vraptor vai procurar… mas a prioridade é a mesma na verdade…

o problema é que /customer/order-{order}/page-{page}/ e /customer/{letter}/page-{page}/ são equivalentes por causa do {letter}… nesse letter vc precisa colocar a regex

Criado 30 de maio de 2010
Ultima resposta 31 de mai. de 2010
Respostas 4
Participantes 2