Problema ao acessar uma URL usando vRaptor! [RESOLVIDO]

Olá pessoal,

Estou tendo problemas para executar uma aplicação de exemplo usando o vRaptor. Estou seguindo a documentação dele mas não estou tendo sucesso.

Configurei o web.xml:

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

Criei a estrutura de pastas para as views:

  • src/main/java
    -------------- + webapp
    --------------------- + WEB-INF
    --------------------------- + jsp
    ------------------------------ + locals
    ----------------------------------- + list.jsp

Como pode ser visto, estou usando o Maven.

Na minha list.jsp eu não tenho nada demais:

[code]<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
<title>Testing a new project</title>
</head>
<body>
It works!! ${variable}
</body>
</html>[/code]
E no meu controlador eu também não tenho nada demais:

[code]@Resource
public class LocalsController {

private Result result;

//private LocalRepository localRepository;

//@Autowired
public LocalsController( /*@Qualifier( "localRepository" ) LocalRepository localRepository,*/ Result result ) {
	this.result = result;
	//this.localRepository = localRepository;
}

public void form() {
	
}

/*@Get
@Path( "/locals" )
public List&lt;Local&gt; list() {
    return localRepository.findAll();
}*/

@Path("/")
public void list() {
	result.include("variable", "VRaptor!");
}

}[/code]

Percebam que eu já fiz mais alguns testes (que estão comentados) e nenhum deles funcionou.

Certo, mas qual o problema?

Eu estou usando a versão 3.2.0 do vRaptor e quando inicio a aplicação e digito no browser: {URL_APLICACAO}/locals/list/ está me sendo retornado um erro:

java.lang.NullPointerException at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:48) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:47) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:619)
Baixei os fontes mas não consegui entender o motivo desse erro. Alguém poderia me ajudar?

De antemão, obrigado!

Alguém poderia ao menos dizer se isso é um erro de configuração ou se é um bug do vRaptor?

Oi bland,

Por padrão o método que não é anotado com um Path tem a seguinte URI: nomeController (sem a palavra “Controller”) + nome do método.

Exemplo:[code]
public class LocalsController {

public void list() { }

}[/code]Para acessar este método você usará a URI /locals/list, mas como você anotou um @Path("/"), será apenas / ou seja, http://localhost:8080/appName/.

Na sua tentativa comentada usando @Path("/locals") seria apenas /locals diretamente.

Não entendi o NullPointer, mas faz o teste tirando a o Path("/") e acessando /locals/list.

Olá Washington,

De antemão, obrigado pela ajuda.

Todos os testes que você recomendou eu fazer, eu já tinha feito. Mesmo assim, refiz os testes e o mesmo erro está sendo apresentado.

Os testes foram:

  • Deixando o método list sem qualquer tipo de anotação

[code]@Resource
public class LocalsController {

private Result result;

public LocalsController( Result result ) {
	this.result = result;
}

public void form() {
	
}

public void list() {
	result.include("variable", "VRaptor!");
}

}[/code]
E fiz o teste acessando a url {URL_APLICACAO}/locals/list/ e nada.
Depois tentei anotar o método apenas com [color=orange]@Path[/color]

[code]@Resource
public class LocalsController {

private Result result;

public LocalsController( Result result ) {
	this.result = result;
}

public void form() {
	
}

@Path( "/locals/list" )
public void list() {
	result.include("variable", "VRaptor!");
}

}[/code]
Nesse caso eu tentei colocar apenas [color=darkblue]"/locals"[/color] e [color=darkblue]"/locals/list"[/color], porém, nada também. O mesmo problema.
Depois disso, adicionei o [color=orange]@Get[/color] acima da anotação [color=orange]@Path[/color] e repeti o teste acima (colocando [color=darkblue]"/locals"[/color] e [color=darkblue]"/locals/list"[/color] no [color=orange]@Path[/color]), mais uma vez sem sucesso.

Não estou conseguindo ver onde estou errado, visto que estou seguindo exatamente os passos que estão sendo listados no site do vRaptor.

Se puder ajudar, serei grato.

Abraço!

Oi bland,

Então o problema não esta nesse controller, pois todos os testes que você deveriam funcionar.

Vai no seu log4j.xml e troca o value dos priority para DEBUG para habilitá-lo e tente ver se esta logando alguma mensagem de erro mais detalhada.
Provavelmente você verá que foi acessado a URI normalmente, porém aconteceu um erro em outro lugar.

Sugiro também que você baixe outro blank-project, da versão 3.2, por exemplo, e teste novamente.

Washington,

Para piorar a situação, após eu modificar o log4j.properties e levantar a aplicação (onde estoura o erro) a última linha apresentada é essa:

Ou seja, aparentemente, tudo normal. Muito estranho.
O meu log4j.properties ficou assim:

log4j.logger.org.vraptor=INFO,Console log4j.logger.com.thoughtworks=INFO,Console log4j.logger.br.com.caelum.vraptor=DEBUG,Console log4j.logger.org.springframework=INFO,Console
Baixei o projeto que você citou do site do vRaptor e consegui rodá-lo. E é isso que está me deixando ainda mais intrigado.

A minha aplicação já existia e eu apenas adicionei o vRaptor a ela, através do Maven. Até então, aparentemente, era apenas seguir o que consta no tutorial do site. E foi isso que fiz.

A ideia é interessante e queria poder conseguir colocar pra funcionar na minha aplicação.

Obrigado mais uma vez.

Abraço.

olá bland, desculpe a demora…

vc pode postar o comecinho dos logs de debug do VRaptor, quando vc sobe a aplicação, por favor?

Fala Lucas,

Não tem nem porque pedir desculpas. De antemão, obrigado pela ajuda.

Como não sabia exatamente o que você quis dizer com

Eu posto em anexo o log inteiro do start da aplicação.

Um abraço e obrigado mais uma vez.

bland, vc tem algum filtro ou listener registrado do spring no web.xml? quais?

Lucas,

Tenho três, que são:

[code] <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

&lt;listener&gt;
	&lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;
&lt;/listener&gt;

&lt;listener&gt;
	&lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt;
&lt;/listener&gt;[/code]

E tenho ainda um outro, que está como teste, que é o:

&lt;listener&gt; &lt;listener-class&gt;com.sun.xml.ws.transport.http.servlet.WSServletContextListener&lt;/listener-class&gt; &lt;/listener&gt;
Fora isso eu tenho algumas configurações de context-param (log4j e os xmls do Spring), servlet e servlet-mapping.

Obrigado pela ajuda.

Abraço!

tira o RequestContextListener, o vraptor já faz isso e dá conflito (por isso o seu NPE)

Lucas,

Muito bom cara. Ao menos não está mais dando NPE.

Porém, agora está dando um erro de HTTP Status 404 - {URL_APLICACAO}/locals/list

Ou seja, não está exibindo nada. Após iniciar a aplicação eu limpei todo o console, pelo Eclipse, e digitei a URL acima. O log que me é exibido é este:

[quote]14:52:17,231 DEBUG [VRaptor ] VRaptor received a new request
14:52:17,231 DEBUG [RequestContextListener] Bound request context to thread: [VRaptorRequest org.apache.catalina.connector.RequestFacade@65394b]
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'br.com.caelum.vraptor.http.EncodingHandlerFactory’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'encodingHandlerFactory’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultRequestExecution’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultInterceptorStack’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultInterceptorHandlerFactory’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultInterceptorStack’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultRequestExecution’
14:52:17,231 DEBUG [DefaultRequestExecution] executing stack DefaultRequestExecution
14:52:17,231 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'nullMultipartInterceptor’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'nullMultipartInterceptor’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'resourceLookupInterceptor’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultResourceTranslator’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultMethodInfo’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultMethodInfo’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultResourceNotFoundHandler’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultMethodNotAllowedHandler’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'VRaptorRequestProvider’
14:52:17,231 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'resourceLookupInterceptor’
14:52:17,231 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
14:52:17,231 DEBUG [DefaultResourceTranslator] trying to access /locals/list
14:52:17,231 DEBUG [RequestContextListener] Cleared thread-bound request context: [VRaptorRequest org.apache.catalina.connector.RequestFacade@65394b]
14:52:17,231 DEBUG [VRaptor ] VRaptor ended the request[/quote]
Pelo log, aparentemente está tudo certo, ou seja, a página deveria ser exibida. Algo muito simples, ao meu ver. Mas, nada. Poderia me dar uma dica do que pode ser? Devo mudar o [color=orange]@Path[/color] do meu método? Ao fazer este teste, o meu método estava assim com [color=orange]@Get[/color] e o [color=orange]@Path/color.

Muito obrigado pela sua ajuda Lucas.

Um grande abraço.

essa lógica tem um jsp?

de qqer forma deveria ter aparecido mais coisas no log…

o controller está anotado com @Resource do VRaptor?

Lucas,

Muito obrigado pela ajuda. Estava com o @Resource errado. Fiz a mudança e funcionou.

Um grande abraço!