NullPointerException ao tentar encontrar relatório Jasper no C: JSF

Bem galera, estou tentado passar o caminho de um relatorio que esta no C: para o IReport mas não esta encontrando, porém testei em um projeto Desktop e funcionou …

FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); InputStream reportStream = context.getExternalContext(). getResourceAsStream("C:/Dados_Projeto/Relatorios_Jasper/Boletos.jasper");

Jul 11, 2012 10:27:03 PM javax.faces.event.MethodExpressionActionListener processAction Grave: 'java.lang.NullPointerException' recebido ao invocar escuta de ação '#{relatoriosBoletos.gerarRelatorio}' para o componente 'j_idt47' Jul 11, 2012 10:27:03 PM javax.faces.event.MethodExpressionActionListener processAction Grave: java.lang.NullPointerException at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source) at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.io.ObjectInputStream.<init>(Unknown Source) at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:53) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:193) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:603) at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:370) at br.com.boletos.relatorios.RelatoriosBoletos.gerarRelatorio(RelatoriosBoletos.java:88) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:262) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) at javax.faces.component.UICommand.broadcast(UICommand.java:300) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at br.com.boletos.filter.ControleFiltro.doFilter(ControleFiltro.java:33) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Oq tem aqui? at br.com.boletos.relatorios.RelatoriosBoletos.gerarRelatorio(RelatoriosBoletos.java:88)

É o método que gera o relatorio

[code]public void gerarRelatorio() throws IOException, JRException, ClassNotFoundException, SQLException{

	Connection conn = getConnection();
	Statement stat = conn.createStatement();
	String SQL = "SELECT "+
		   		     "lancamentos.`id` AS id, "+
		   		     "lancamentos.`dataemissao` AS dataemissao, "+
		   		     "lancamentos.`datavencimento` AS datavencimento, "+
		   		     "lancamentos.`observacao` AS observacao, "+
		   		     "lancamentos.`numBoleto` AS parcela, "+
		   		     "lancamentos.`valor` AS valorparc, "+
		   		     "usuario.`id` AS usuario_id, "+
		   		     "usuario.`nome` AS usuario_nome, "+
		   		     "cliente.`id` AS cliente_id, "+
		   		     "cliente.`nome` AS cliente_nome, "+
		   		     "cliente.`sobrenome` AS cliente_sobrenome, "+
		   		     "cliente.`cpf` AS cliente_cpf, "+
		   		     "cliente.`endereco` AS cliente_endereco, "+
		   		     "cliente.`numero` AS cliente_numero "+
		   		"FROM "+
		   		     "`usuario` usuario INNER JOIN `lancamentos` lancamentos ON usuario.`id` = lancamentos.`usuario` "+
		   		     "AND usuario.`id` = lancamentos.`usuario` "+
		   		     "INNER JOIN `cliente` cliente ON lancamentos.`cliente` = cliente.`id` "+
		   		"WHERE "+
		   		     "lancamentos.impresso = 'N'";//
	
	ResultSet rs = stat.executeQuery(SQL);
	
	FacesContext context = FacesContext.getCurrentInstance();
	HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
	InputStream reportStream = context.getExternalContext().
			getResourceAsStream("C:/Dados_Projeto/Relatorios_Jasper/Boletos.jasper");
			
	
	Usuario sessao = new Usuario();
	HttpSession sessioon = (HttpSession) FacesContext.getCurrentInstance()
			.getExternalContext().getSession(false);
	
	sessao = (Usuario) sessioon.getAttribute("usuario");
	
	Map parametro = new HashMap();
	
	parametro.put("usuario", sessao.getNome().toUpperCase());
	
	//FORÇA O DOWNLOAD DO ARQUIVO
	//response.setContentType("application/pdf");
	//response.setHeader("Content-disposition", "attachament;filename=relatorio.pdf");
	
	try {
		ServletOutputStream servletOutputStream = response.getOutputStream();
		JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
		
		JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream,parametro,jrRS);
		
		servletOutputStream.flush();
		servletOutputStream.close();
	
	} catch (JRException e) {
		e.printStackTrace();
	
	}catch (IOException e) {
		e.printStackTrace();
	
	}finally{
		context.responseComplete();
	}
	
	
	//gerarRelatorioWeb(jrRS,null,arquivo);
}[/code]

Ok, a linha q eu postei lá em cima, aponta o local exato do nullpointer.

Vc debugou? em qual linha acontece o erro?

O Erro é aqui:

InputStream reportStream = context.getExternalContext(). getResourceAsStream("C:/Dados_Projeto/Relatorios_Jasper/Boletos.jasper");
Quero pegar meu relatótio no C: pra facilitar as alterações nele.

Fiz dessa forma aqui pra testar:

InputStream reportStream = context.getExternalContext(). getResourceAsStream("/Relatorios_Jasper/Boletos.jasper");

Que é o Relatório que esta dentro do Projeto e rodou normalmente …

Quando vc usa /, vc usa um caminho relativo ao contexto do projeto.

Normalmente /nomeDoProjeto/webContent/qualquerPastaSeTiver/relatorios

Quando vc usa c:/ vc esta usando um caminho absoluto, então nesse caso , para pegar o arquivo do projeto no c://
teria que usar o caminho c://sua workspace até a pasta relátorios/.

Tente desta forma (“C:\Dados_Projeto\Relatorios_Jasper\Boletos.jasper”)
Como é Windows pode ter alguma diferença!

É … de nenhuma das duas formas funcionou …

Saudações companheiro…

Tente usar:


String caminhoRelatorio = System.getProperty("user.dir") + "//Relatorios_Jasper//Boletos.jasper";
InputStream reportStream = context.getExternalContext().getResourceAsStream(caminhoRelatorio);

O getProperty da classe System recupera o diretorio do projeto…

caso não de certo…
ao inves do input Stream use isto:

JasperReport jr =  (JasperReport) JRLoader.loadObject(caminhoRelatorio); 

[quote]Meritos ao Guilherme Pizzaia[/quote] :slight_smile:

Continua com erro, porém, olha só o caminho que ele esta retornando:

C:\Documents and Settings\FISCAL\Meus documentos\eclipse//Dados_Projeto//Relatorios_Jasper//Boletos.jasper

esse cara aqui > \Documents and Settings\FISCAL\Meus documentos\eclipse/ não quero ele, pois a pasta esta aqui:

C:Dados_Projeto/

Se bem entendi isso irá me trazer o diretório do User certo ?

String caminhoRelatorio = System.getProperty("user.dir")

Mas, eu quero a raiz, independente do user logado

System.getProperty(“user.dir”) - retorna o caminho de onde o projeto está sendo executado, ou seja, o local onde está o seu .jar!!!

Se você quiser outro caminho deverá adicionar manualmente, da forma que você está fazendo…
Mas não sei o porque permanece o erro!!!

Certo … fiz o seguinte:

[code]//RETORNA O CAMINHO ATE O DESKTOP
String caminho = FileSystemView.getFileSystemView().getRoots()[0].toString();
//CONCATENO O CAMINHO COM A PASTA E O ARQUIVO
String caminhoRelatorio = caminho+"\Dados_Projeto\Relatorios_Jasper\Boletos.jasper";
//CONCATENO O CAMINHO COM A PASTA E O ARQUIVO
Object caminhoLogo = caminho+"\Dados_Projeto\LogoTipo\Logo_Sport.PNG";

System.out.println(caminho);
System.out.println(caminhoRelatorio);
System.out.println(caminhoLogo);

InputStream reportStream = context.getExternalContext().
getResourceAsStream(caminhoRelatorio);[/code]

Saída do Console:

C:\Documents and Settings\FISCAL\Desktop C:\Documents and Settings\FISCAL\Desktop\Dados_Projeto\Relatorios_Jasper\Boletos.jasper C:\Documents and Settings\FISCAL\Desktop\Dados_Projeto\LogoTipo\Logo_Sport.PNG
Estranho, esta retornando NullPointerException ainda.

Bem, fiz um teste com uma classe simples, com os mesmos métodos e funciona, mas no Projeto no JSF não …