VRaptor 3 - Null Pointer Exception no Result.include

9 respostas
J

Pessoal,

Sou iniciante no VRaptor 3. Estou obtendo Null Pointer Exception em alguns Controllers ao chamar Result.include(…), porém isso não acontece sempre.

No controller do código abaixo, por exemplo, consigo executar o logic listar e o incluir, mas ao voltar a executar algum deles (Não necessariamente na segunda vez), a linha em que o Result.include está lança a exceção (Nem o result e nem o objeto em questão estão nulos).

Os Controllers em que isso acontece são “SessionScoped”. Acho que pode ser algo com a sessão mas não sei exatamente o que.
Alguem sabe o que isso pode ser?

Abaixo, seguem trechos do código:

@Resource
public class PapeisController {

	// Controller Attributes
	private final DaoFactory daofactory;

	private final Result result;
	
	// Constructor Method
	public PapeisController(DaoFactory daoFactory, Result result) {
		this.daofactory = daoFactory;
		this.result = result;
	}
	
	// Action Methods
	/**
	 * URL: /papeis
	 * View: /WEB-INF/jsp/papeis/listar.jsp
	 */
	@Path("/papeis")
	public void listar(String[] listaEventosSelecionados) {
		
		try {
			// Lista os projetos e os disponibiliza para a view.
			this.result.include("listaPapeis", this.daofactory.getPapelDao().listar());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * URL: /papeis/incluir 
	 * View: /WEB-INF/jsp/papeis/incluir.jsp
	 */
	@Path("/papeis/incluir")
	public void incluir(PapelVo pPapel) {
		
		try {
			// Busca as ferramentas do sistema.
			// Disponibiliza os dados para a view.
			if (pPapel != null) {
				this.result.include("listaFerramentas", this.daofactory.getFerramentaDao().listar(
						pPapel.isEnvironment()));
			}
			else {
				this.result.include("listaFerramentas", this.daofactory.getFerramentaDao().listar(false));
			}
			
			this.result.include("pPapel", pPapel);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

9 Respostas

king_of_gods

Amigo, poste a classe completa. Não abrevie nada.

Pq vc não coloca seu DAO passando como parâmetro.

J

Desculpa :slight_smile: atualizei com o código da classe.
Ainda está em desenvolvimento, neste ponto o erro já ocorre.

Como parâmetro para o Result? Não tinha pensado nisso.
Oferece alguma vantagem?

king_of_gods

Não. Eu falei no Construtor, mas vi que você está passando o DaoFactory no construtor.

Só dar um toque, é mais gosto pessoal.

Ao invés de passar a lista direto no result, tenta criar uma lista antes e dps vc inserir no result.

Exemplo:

List listaPapeis = this.daofactory.getPapelDao().listar();
this.result.include("listaPapeis", listaPapeis);

Uma curiosidade, pq está usando DaoFactory? Não acha interessante usar o DAO direto ao invés da fábrica?

J

Fica com o mesmo problema. Na verdade havia desenvolvido assim, depois alterei para enviar o retorno direto p result.

Acho que o código fica mais organizado por causa da quantidade de DAOs. Fora isso, nenhuma razão mais técnica. :slight_smile:

king_of_gods

Fica com o mesmo problema. Na verdade havia desenvolvido assim, depois alterei para enviar o retorno direto p result.

Acho que o código fica mais organizado por causa da quantidade de DAOs. Fora isso, nenhuma razão mais técnica. :slight_smile:

Qto ao erro, voltou a acontecer? Cola o erro pra dar uma olhada.

J

Continua :?
Em alguns controllers que não tem escopo de sessão o problema não acontece.
O problema é que preciso desse escopo em outros.

Segue o Null Pointer:

java.lang.NullPointerException
	at org.apache.catalina.connector.Request.setAttribute(Request.java:1383)
	at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:501)
	at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:284)
	at br.com.caelum.vraptor.core.DefaultResult.include(DefaultResult.java:53)
	at br.unifacs.wgpms.controller.PapeisController.incluir(PapeisController.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	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:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:619)
king_of_gods

Amigo, explica o queres fazer. Talvez exista uma outra solução em vez de deixar o escopo como sessão.

J

É um cadastro dividido em telas por causa do número e da estrutura dos campos.
A quantidade de campos deixa complicado fazer usando escopo de Request pois teria que guardar muitas informações em inputs do tipo hidden.
Tem idéia do que possa ser esse problema? Lembrando que quando ocorre nem o Result e nem a lista estão nulos.

Lucas_Cavalcanti

seu Controller depende de um componente Request Scoped (o Result), logo ele não pode ser SessionScoped, pois logo que acaba a primeira requisição, o Request que está dentro do Result é apagado, por isso vc recebe a Null Pointer exception…

o que vc pode fazer é separar os dados que vc quer guardar durante esse seu processo em uma outra classe, essa sim session scoped, e receber ela no construtor do seu controller…

daí ao invés de vc guardar os dados dentro do controller, vc guarda dentro dessa outra classe

Criado 4 de maio de 2010
Ultima resposta 4 de mai. de 2010
Respostas 9
Participantes 3