Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Path com injeção de variáveis junto com linkTo

Olá.

Tentei usar linkTo para montar uma URI para um @Path com injeção de variáveis, mas não consegui – recebo a seguinte exception:

br.com.caelum.vraptor.Vraptor.doFilter(VRaptor.java:127)

Tentei no JSP o seguinte:

<a href="${linkTo[QuestoesController].form(atividade.id)}">Incluir questão</a>

E no controller:

@Path("/atividade/{atividade.id}/novaQuestao")
public void form(Atividade atividade) {

Se no JSP informar a URI sem o linkTo (como abaixo) funciona:

<a href="<c:url value="/atividade/${atividade.id}/novaQuestao" />">Incluir questão</a>

O problema ocorre somente quando há uma rota definica no Path mapeando um atributo de uma classe (como mostrei acima).

O linkTo de fato não funciona quando o método popula um objeto Na documentação do Vrator onde fala de injeção de variáveis não há nenhuma menção ao linkTo (seja indicando ou falando de restrições). http://www.vraptor.org/pt/docs/controllers-rest/#path-com-injeo-de-variveis

Gostaria de saber se de fato não é possível usar o linkTo nesse caso.

Obs: Não encontrei nenhum caso de uso semelhante ao que estou tentando no livro do vraptor nem nas apostilas da Caelum FJ-28.

Desde já agradeço.

6 respostas
solução!

Tentei olhar um pouco do código fonte no github, inclusive os testes e não vi um caso parecido com o que vc falou... De todo jeito, vc chegou a testar com

${linkTo[QuestoesController].form(atividade)}

É só um chute.

Oi Alberto.

Testei do jeito que tu sugeriu e funcionou.

Se a configuração da rota no método estiver esperando um parâmetro normal (não atributo de classe) o linkTo funciona passando atividade.id. Como segue:

@Path("/atividade/{id}/teste")
public void teste(int id) { }

No JSP:

<a href="${linkTo[QuestoesController].teste(atividade.id)}">Incluir questão - soh atividade</a>

Não acha que tem coisa estranha?

Muito obrigado pela resposta tão rápida.

Não... Nesse caso, como vc mapeou apenas um tipo simples no path, vc precisou passar um parâmetro do mesmo tipo. O parâmetro que vc passa no linkTo é o mesmo que o método real espera.

Alberto, a estranheza que citei não foi por esse último caso funcionar, mas pelo primeiro caso, onde mapeei no path o atividade.id e precisei passar somente "atividade" (como vc sugeriu) no linkTo.

É que vc mapeou o atividade.id, mas o argumento do método era só atividade. O linkTo funciona baseado nos argumentos do método, não do que está no path. O que é até bom :).

Agora o motivo ficou claro.

Muito obrigado Alberto!