Problema Vraptor 3 + tiles

Olá pessoal estou tnetando integrar o vraptor3 com tiles seguindo os passos do “vraptor3cookbook” mas não estou consegundo.
A aplicação sempre me retorna um erro 404 quando acesso a url http://localhost:8080/vraptor-teste/candidato/mostraPesquisa,
bom… não sei o que estou fazendo de errado, se alguem puder me ajudar agradeço muito.

Seguem minhas configurações:

web.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

vraptor-teste

index.html



org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
/WEB-INF/classes/tiles.xml



TilesServlet
org.apache.tiles.web.startup.TilesServlet
2



TilesDispatchServlet
org.apache.tiles.web.util.TilesDispatchServlet



TilesDispatchServlet
*.tiles


br.com.caelum.vraptor.packages

br.ceuma.teste

<filter>
	<filter-name>vraptor</filter-name>
	<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>

<filter-mapping>
	<filter-name>vraptor</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>REQUEST</dispatcher>
</filter-mapping>
[/code]

pathResolver:

[code]@Component
public class TilesPathResolver implements PathResolver {
private static final String VIEW_SUFIX = “.tiles”;
private static final String CLASS_SUFIX = “Controller”;

@Override
public String pathFor(ResourceMethod method) {
	
	final Class<?> clazz = method.getResource().getType();
	String pkgname = clazz.getPackage().getName();
	final StringBuilder s = new StringBuilder();
	s.append("/");
	// retorna apenas o nome do último pacote
	s.append(pkgname.substring(pkgname.lastIndexOf(".") + 1));
	s.append(".");
	//remove o sufixo controller
	s.append(clazz.getSimpleName().substring(0, clazz.getSimpleName().indexOf(CLASS_SUFIX)));
	s.append(".");
	s.append(method.getMethod().getName());
	s.append(VIEW_SUFIX);
	// definições do tile em minusculo, mas você pode alterar isso
	return s.toString().toLowerCase();
	
}

}
[/code]

controller:

@Resource
public class candidatoController {
	
	
	public void mostraPesquisa(){
		
	}

}

tiles.xml

<tiles-definitions>
  <definition name="base" template="/WEB-INF/default.jsp">
      <put name="corpo"  value=""></put>
  </definition>
  <definition name="teste.candidato.mostrapesquisa" extends="base"  >
               <put name="corpo" value="/WEB-INF/candidato/mostraPesquisa.jsp"></put>
  </definition>  
</tiles-definitions>

erro retornado pelo browser:

[quote]HTTP Status 404 - /vraptor-teste/teste.candidato.mostrapesquisa.tiles

type Status report

message /vraptor-teste/teste.candidato.mostrapesquisa.tiles

description The requested resource (/vraptor-teste/teste.candidato.mostrapesquisa.tiles) is not available.
[/quote]

O que acontece quando você acessa direto o URI:

/vraptor-teste/teste.candidato.mostrapesquisa.tiles

Olá garcia-jj, quando coloco a essa url ele me retorna essa exceção:

java.lang.NullPointerException org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory.getDefinition(UnresolvingLocaleDefinitionsFactory.java:102) org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:364) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:618) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321) org.apache.tiles.web.util.TilesDispatchServlet.doGet(TilesDispatchServlet.java:100) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler.couldntFind(DefaultResourceNotFoundHandler.java:41) br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60) br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

Apenas isso? Ou seu tiles não está inicializado ou então essa definition não existe. Embora se fosse definition não contrada teria uma DefinitionNotFoundException.

Você consegue ver nos logs se o tiles está sendo inicializado?

[Editado]
Consegui fazer funcionar aqui baixando a versão 2.1 do tiles (estava usando a 2.2), acho que no 2.2 a forma de configurar é diferente.

Valeu pela força garcia-jj!!!
[/Editado]

acho que fui muito apressado :? , só ta funcionando se eu digitar a url http://localhost:8080//vraptor-teste/teste.candidato.mostrapesquisa.tiles, mas pela url do controller “http://localhost:8080/vraptor-teste/candidato/mostraPesquisa” continua dando erro 404 e o pior, não dá nenhuma exceção. segue o log:

17:28:34,708 DEBUG [DefaultResourceTranslator] trying to access /candidato/mostraPesquisa 17:28:34,708 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.ceuma.teste.candidatoController.mostraPesquisa} 17:28:34,723 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.ceuma.teste.candidatoController.mostraPesquisa() as [] 17:28:34,723 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.ceuma.teste.candidatoController.mostraPesquisa} are [] 17:28:40,222 DEBUG [DefaultResourceTranslator] trying to access /teste.candidato.mostrapesquisa.tiles

Pode colocar aqui o seu definitions?

segue as definitions:

[code]<?xml version="1.0" encoding="UTF-8"?>

[/code]

Coloca sua deinition com / no incio, por exemplo, <definition name="/teste.candidato.mostrapesquisa"

Cara já tentei aqui e nada, continua a dar o mesmo erro. ja tô sem esperanças :(.
mas vou continuar tentando, qualquer coisa eu posto aqqui.

Obrigado pela atenção garcia.

cordjr, desculpe ter perdido esse tópico de vista.

Altere seu TilesPathResolver e adicione uma linha aí de log para entendermos o que pode estar acontecendo.

Após a linha “s.append(VIEW_SUFIX);” adicione isso abaixo. Assim podemos entender para onde está sendo feito o redirect.

O servlet do tiles está antes ou depois da definição do vraptor?

Lucas, você que conhece melhor, como o vraptor faz o deferer pro container? Será que pode ser o vraptor tentando pegar essa URL para ele e evitando que ele seja passado pelo tiles?

Olá garcia-jj, adicionei um logger na lclasse e fiz como você sugeriu, o log ficou assim

[quote]15:57:44,795 DEBUG [DefaultResourceTranslator] trying to access /candidato/mostraPesquisa
15:57:50,014 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.ceuma.teste.candidatoController.mostraPesquisa}
15:57:50,686 DEBUG [AsmBasedTypeCreator ] Trying to make class for candidatoController$mostraPesquisa$1277959566$1
15:57:50,702 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.ceuma.teste.candidatoController.mostraPesquisa() as []
15:57:50,702 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: []
15:57:50,702 DEBUG [AsmBasedTypeCreator ] Methods: []
15:57:50,702 DEBUG [AsmBasedTypeCreator ] Fields: []
15:57:50,702 DEBUG [CacheBasedTypeCreator] cached generic type for method {DefaultResourceMethod: br.ceuma.teste.candidatoController.mostraPesquisa}
15:57:50,733 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.ceuma.teste.candidatoController.mostraPesquisa() as []
15:57:50,733 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.ceuma.teste.candidatoController.mostraPesquisa} are []
15:57:52,342 DEBUG [TilesPathResolver ] resultado final de TilesPathResolver : é : teste.candidato.mostraPesquisa.tiles <----
15:57:52,421 DEBUG [DefaultResourceTranslator] trying to access /candidato/teste.candidato.mostrapesquisa.tiles
[/quote]
O servlet do tiles está declarado antes do filter do vraptor.

Há algo errado, deveria ser /teste.candidato.mostraPesquisa.tiles.

É importante ter essa barra tanto no definitions quanto no componente que faz o path resolver.

Pessoal, estou tendo exatamente o mesmo tipo de problema, alguém aí descobriu o que se passa ???

Estou que nem louco atrás desta solução, caso consiga encontrá-la postarei aqui também.

Grato !

mauriciovoto, qual a versão do tiles você usa?

Olá garcia-jj, estou usando a versão 2.1.4 pois tive problemas com a 2.2.1. Porém um amigo meu deu uma força para partir para uma nova abordagem.

Agora, estou utilizando os templates do tiles nas jsps e deixando o direcionamento somente para o VRaptor, sem a utilização do PathResolver.

Para a minha necessidade, bastou !

Grato a todos !

Se você usa a versão 2.1x você pode usar a minha receita de bolo que está no site do vraptor.

http://vraptor.caelum.com.br/cookbook/usando-tiles-com-vraptor3/