Problema Vraptor 3 + tiles

15 respostas
cordjr

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>vraptor-teste</display-name>	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
	<!-- arquivo de definições do tiles -->
	<context-param>
		<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
		<param-value>/WEB-INF/classes/tiles.xml</param-value>
	</context-param>
	<!-- servlet de inicialização do tiles -->
	<servlet>
		<servlet-name>TilesServlet</servlet-name>
		<servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
	<!-- servlet que responde as requisições do tiles -->
	<servlet>
		<servlet-name>TilesDispatchServlet</servlet-name>
		<servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
	</servlet>
	<!-- o tiles responderá por toda requisição *.tiles -->	
	<servlet-mapping>
		<servlet-name>TilesDispatchServlet</servlet-name>
		<url-pattern>*.tiles</url-pattern>				
	</servlet-mapping>
	<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<!-- Change this parameter to your app base package -->
		<param-value>br.ceuma.teste</param-value>
	</context-param>

	<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>
	
	
</web-app>
pathResolver:
@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();
		
	}

}
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:

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.

15 Respostas

G

O que acontece quando você acessa direto o URI:

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

cordjr

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)

G

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?

cordjr

[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

G

Pode colocar aqui o seu definitions?

cordjr

segue as definitions:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition name="base" template="/WEB-INF/jsp/default.jsp">
    <put-attribute name="corpo" value=""></put-attribute>    
</definition>   
   
  <definition name="teste.candidato.mostrapesquisa" extends="base"  >
         <put-attribute name="corpo" value="/WEB-INF/jsp/candidato/mostraPesquisa.jsp"></put-attribute>               
  </definition>  
</tiles-definitions>
G

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

cordjr

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.

G

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?

cordjr

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

<blockquote>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$[telefone removido]$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

</blockquote>

O servlet  do tiles está declarado antes do filter do vraptor.
G

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

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

mauriciovoto

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 !

G

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

mauriciovoto

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 !

G

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/

Criado 1 de dezembro de 2009
Ultima resposta 23 de fev. de 2010
Respostas 15
Participantes 3