Problemas Vraptor 3 + tiles + Restful

Bom dia Galera, sou usuário novo do GUJ porém leitor muito antigo…

Estou com uma dúvida que não estou conseguindo resolver…

Estou desenvolvendo uma aplicacao que carregará um perfil atraves de um parametro recebido na URL
Ex: www.minhaapp.com/PARAMETRO, estilo Twitter…

Pois bem, para isso anotei um método com @Path para receber o parametro no método e assim carregar o perfil e devolver para a jsp!
Perfeito funciona! Recebo o login do usuario e assim carrego o perfil retornando para a jsp default.

O meu problema encontra-se quando tento usar o tiles com a receita de bolo do site… configurei o tiles e funcionou perfeitamente também, porém só quando removo a anotacao @Path que recebe o parametro, se nao removo ao inves de procurar na definitions do tiles depois que executa o método ele recebe o name como parametro no mesmo método.

Se alguem puder me ajudar agradeco desde já.

Muito agradecido e parabéns pelo Vraptor nao tive duvida sobre a escolha do Framework.

Abs

Não sei se entendi muito bem o problema, já que a última frase está um pouco confusa.

Há uma ordem que deve ser respeitada, colocando o servlet do tiles sempre antes do vraptor. A impressão que tenho é que o vraptor está tentando processar as requisições do tiles.

Você pode nos deixar aqui como está seu controller?

Vamos la… desde já obrigado pela atenção

Tenho um método:

@Resource
public class PessoaController {

	@Get
	@Path("/{login}")
	public void carregarPerfil(String login) {
		
		// Carregar Perfil
		// Retornar para tela as informações
	}

}

por convenção o vrpator retorna a página para WEB-INF/jsp/pessoa/carregarPerfil.jsp

Ok!

Quando alteramos a convenção passando a retornar pacote.classe.metodo.tiles, no final da execução do método ele nao vai buscar no definitions ele acaba caindo no método carregarPerfil de novo e recebendo o valor de login = pacote.classe.metodo.tiles

teoricamente ele faria algo assim:
www.minhaapp.com/pacote.classe.metodo.tiles

porem o vraptor entende isso como parametro recebido e que deve ser tratado pelo metodo carregarLogin e nao para usar as configurações do tiles…

Ficou compreensível?

Obrigado

O problema é que você usou /x, sendo que isso significa TUDO no vraptor. Ou seja, se você tentar acessar /meu-endereco-tiles ele irá cair no seu método.Tente fazer algo como @Path("/~{login}") para você ver como assim funciona. O problema de usar um wildcard assim como /* é que você pegará todos os acessos, inclusive os forwards para o JSP, já que o filter do vraptor é interceptado tanto via request como forward.

Você também pode tentar algo como @Path("/{login}/") com a barra no final.

Cara qual a finalidade do @Path("/~{login}")? assim nao entre por nada no método…

e quanto ao @Path("/{login}/") meu usuário teria que colocar a barra no final?

alguma outra sugestao?

para que o user digite http://minhapp.com/seuLogin

carregue o metodo e redirecione para o tiles.

valeuuuuuuuuuuuuuuuuuuu

como vc vai usar o tiles só por baixo da aplicação, vc pode registrá-lo para urls do tipo:

/tiles/nome.do.template.tiles

assim vc não precisa mudar seu método que tem @Path("/{login}")

de qqer forma tem esse tutorial sobre o tiles + vraptor:
http://vraptor.caelum.com.br/cookbook/usando-tiles-com-vraptor3/

Lucas foi neste tutorial que eu me basiei, e funciona perfeitamente se eu nao tivesse metodos com @Path recebendo parametros…

Eu nao entendi sua explicação…

deveria mudar meu Path TilesPathResolver para retornar /tiles/pacote.classe.metodo.tiles

e este ser o nome da definition?

isso, tudo o que for do tiles vai começar com /tiles

rodrigo.lopes, o problema que usando o path @Path("/{login}") o vraptor irá pegar TODAS as requisições. Note que conforme você falou o endereço do forward para o tiles é www.minhaapp.com/pacote.classe.metodo.tiles,sendo assim ele irá entrar de novo no seu @Path("/{login}"), pois a expressão atende ao /pacote.classe.metodo.tiles.

Entendeu?

Não vai funcionar, pois /tiles também atende ao @Path("/{login}").

Aliás se pensarmos bem, isso nem deveria ser permitido, pois /expressão captura TODAS requisições sem distinção alguma.

Isso que o Lucas falou eu ja testei tb, nao funciona… :cry:

mas sera que existe alguma saída?

talvez com interceptor?

se eu fossr criar um twitter com tiles

www.twitter.com/meuLogin

como eu poderia fazer? alguma outra sugestao

preciso desenvovler algo semelhante

Não vai funcionar, pois /tiles também atende ao @Path("/{login}").

Aliás se pensarmos bem, isso nem deveria ser permitido, pois /expressão captura TODAS requisições sem distinção alguma.[/quote]

na verdade @Path("/{login}") pega todas as uris que não contém ‘/’… ou seja, vai pegar /joaomaria mas não vai pegar /tiles/qqercoisa

rodrigo, posta seu web.xml por favor?

[quote=rodrigo.lopes]se eu fossr criar um twitter com tiles

www.twitter.com/meuLogin

como eu poderia fazer? alguma outra sugestao

preciso desenvovler algo semelhante[/quote]

Eu usaria www.meusite.com.br/profile/fulano@email.com

Ahhh sim, isso é verdade. Também dá para usar as priorities, não é?

Nesse caso o /tiles/foo.tiles deveria funcionar, certamente. Pode ser mesmo alguma coisa no web.xml.

se vc tirar o dispatcher “FORWARD” do filtro do VRaptor, e deixar só ele no filtro do tiles deve funcionar

Ok valeu!

vou testar e a noite volto a postar observações

muito obrigado

Assim você não perde o result.forwardTo()?

não… pq o vraptor não faz um forward pra url do outro controller… ele executa de verdade e faz um forward pra view dele…