Apanhando com o Ireport ! Alguem me ajuda?

27 respostas
V

Colegas seguinte :

instalei o Ireport/Jasper, tudo tranquilo

Fiz um formulario nele através do Ireport ! Funcionando bem no modo visual.

Criei um diretorio logo abaixo do WebContent chamado relatorios lá salvei meu formulario : o Ireport criou 3 extensões dele : .XML .PDF .JASPER

Lá ma minha aplicação fiz uma classe para impressão :

public void geraFichaFiliacao(Connection con){
			String retorno ="";
			sb = new StringBuffer();
			try {
				sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				Map parameters = new HashMap();
				JasperFillManager.fillReportToFile("relatorios/filiacao.jasper",parameters,jrRS);
				JasperExportManager.exportReportToPdfFile("relatorios/filiacao.jrprint");
				JasperViewer.viewReport("relatorios/filiacao.pdf",false);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

Ele está me mostrando a seguinte mensagem no StackTrace :

java.io.FileNotFoundException : relatorios\filiacao.jasper

Notem que ele “inverte” o parenteses ?!?!? (Não sei se está certo)

Poderiam me mostrar no que estou errando ? O que está faltando ?

Obrigado

Vimieiro

27 Respostas

ramilani12

Como esta estrutura do seu projeto?
Esta pasta se encontra aonde? relatorios/filiacao.jasper

Seria interessante coloca-la no classpath default que é src do seu projeto.

V

A sim : coloquei ela em meuprojeto/WebContent

no mesmo nivel do diretorio das Paginas.

vimieiro

ramilani12

De uma olhada na classe HttpServletRequest no metodo getRealPath ou da ServletContext.getRealPath
http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

Um conselho utilize o caminho do Class-Loader , assim vc manterá compatibilidade entres AppServers, já passei problemas com Weblogic em tempo projeto getRealPath funcionava que era uma blza , mas ao gerar o EAR/WAR , o weblogic explodia o arquivo de uma forma que não entendia a estrutura dos arquivos era diferente.

Um exemplo com class-loader:

SuaClasse.class.getResourceAsStream("relatorios/filiacao.jaspe");
      //no src deverá conter um diretorio relatorios/*.jasper

Este metodo retorna um InputStream so precisa verificar se o metodo fillReportToFile aceita um InputStream
Ao gerar o WAR/EAR ele jogara esta estrutura para WEB-INF/classes

Deluxe
InputStream reportStream = context.getExternalContext().getResourceAsStream("/jasper/UsuariosRm.jasper");

tenta colocar uma barra atras

V

Saquei ±

Minha estrutura, agora, está assim :

meucontexto src org sindieletro dao relatorios filiacao.jasper filiacao.xml filiacao.dbf servlets

Sacou ?

Fiz do jeito que me passou :

public void geraFichaFiliacao(Connection con){
			String retorno ="";
			sb = new StringBuffer();
			String path = "/org/sindieletro/relatorios/filiacao.jasper";
			try {
				sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
//				FiliacaoDAO.class.getResourceAsStream("relatorios/filiacao.jaspe"); 
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				Map parameters = new HashMap();
				JasperFillManager.fillReportToFile(FiliacaoDAO.class.getResourceAsStream("relatorios/filiacao.jasper").toString(),parameters,jrRS);
				JasperExportManager.exportReportToPdfFile("relatorios/filiacao.jrprint");
				JasperViewer.viewReport("relatorios/filiacao.pdf",false);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

E agora está aparecendo o seguinte erro :

04/07/2008 14:46:41 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 828 ms
04/07/2008 14:46:41 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
04/07/2008 14:46:41 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.25
04/07/2008 14:46:41 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
04/07/2008 14:46:41 org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
04/07/2008 14:46:41 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
04/07/2008 14:46:41 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/47  config=null
04/07/2008 14:46:41 org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
04/07/2008 14:46:41 org.apache.catalina.startup.Catalina start
INFO: Server startup in 969 ms
java.lang.NullPointerException
	at org.sindieletro.socios.dao.FiliacaoDAO.geraFichaFiliacao(FiliacaoDAO.java:124)
	at org.sindieletro.socios.servlet.FiliacaoSL.doPost(FiliacaoSL.java:84)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	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:151)
	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(Unknown Source)

Poderia me ajudar + 1 vez ?

:oops: :oops:

vimieiro

Deluxe
/relatorios/filiacao.jasper"

tenta colocar a barra antes…
outra coisa
se debugo o codigo pra ver em qual linha ele da pau?

V

Amigo deluxe, tentei colocar a barra e o erro permanece :

Ele aponta para a linha

JasperFillManager.fillReportToFile(FiliacaoDAO.class.getResourceAsStream("/relatorios/filiacao.jasper").toString(),parameters,jrRS);

Aqui, em seu exemplo anterior, que variável é esta context

abs

:oops: :cry: :oops: :cry:

mateusprado

acrecente altere o caminho para “src/relatorio/arquivo.jasper”

V

Aqui, a exception lançada é por que :

String path = FiliacaoDAO.class.getResourceAsStream("src/relatorios/filiacao.jasper").toString();

Não é um comando aceito

Retirei esta instrução :

Agora meu método está assim :

public void geraFichaFiliacao(Connection con){
			sb = new StringBuffer();
			try {
				String path = "/src/org/sindieletro/relatorios/filiacao.jasper";
				sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				Map parameters = new HashMap();
				JasperFillManager.fillReportToFile(path,parameters,jrRS);
				JasperExportManager.exportReportToPdfFile("/relatorios/filiacao.jrprint");
				JasperViewer.viewReport("/relatorios/filiacao.pdf",false);
				
			} catch (NullPointerException en) {
				en.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

E continua dando FileNotFoundException. Não sei por quemas ele não está encontrando o arquivo filiacao.jasper !!!

:cry: :cry:

netShot

já tentou :

String caminhoDoRelatorio = getClass().getClassLoader().getResource("pacote/ondeEstaO.jasper").getPath();
            System.out.println(caminhoDoRelatorio);

ou

URL caminhoDoRelatorio = getClass().getClassLoader().getResource("pacote/ondeEstaO.jasper");
            System.out.println(caminhoDoRelatorio.getFile());
D

[color=green]Olá.

Acredito que o código abaixo possa lhe ajudar:[/color]

File reportFileJasper = new File(getServletConfig().getServletContext() .getRealPath("/relatorios/filiacao.jasper")); ... JasperFillManager.fillReportToFile(reportFileJasper.getPath(), parametros, con); [color=green]Até…[/color]

V

netShot tentei com String e deu exception

depois tentei com url e o resultado foi NULL :

URL caminhoDoRelatorio = getClass().getClassLoader().getResource("/src/org/sindieletro/relatorios/filiacao.jasper");

Adriano, vou tentá

qq ajuda será bem vinda

vimieiro

V

Adriano fiz o que vc sugeriu :

No Debbug veio a seguinte String em file :

C:\Sun\JAVA\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\sindieletro\relatorios\filiacao.jasper

Doido né ?

V

Ainda apanhando … :cry: :cry: :cry:

V

Amigos, coloquei meu pacote relatorios logo abaixo do SRC

minha estrutura ficou assim :

sindieletro
    src
       org
          sindieletro
              filter
              dao
              netbean
              servlet
              .
              .
       relatorios
          filiacao.jasper
          filiacao.jrprint
          filiacao.xml

meu codigo :

try {
				sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				
				Map parameters = new HashMap();  
		        JasperFillManager.fillReportToFile("src/relatorios/filiacao.jasper",  
				                 parameters,jrRS);  
		        JasperExportManager.exportReportToPdfFile("src/relatorios/filiacao.jrprint");  
				JasperViewer.viewReport("src/relatorios/filiacao.pdf", false);

O erro :

INFO: Find registry server-registry.xml at classpath resource
07/07/2008 13:10:47 org.apache.catalina.startup.Catalina start
INFO: Server startup in 906 ms
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: src\relatorios\filiacao.jasper
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:75)
	at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:443)
	at org.sindieletro.socios.dao.FiliacaoDAO.geraFichaFiliacao(FiliacaoDAO.java:132)
	at org.sindieletro.socios.servlet.FiliacaoSL.doPost(FiliacaoSL.java:86)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	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:151)
	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(Unknown Source)
Caused by: java.io.FileNotFoundException: src\relatorios\filiacao.jasper
	... 20 more

Por favor colegas, alguem que já passou por isso ! me ajudem !

D

[color=green]Olá.

Aqui segue o fonte que eu utilizo em uma aplicação web:[/color]

ServletOutputStream servletOutputStream = res.getOutputStream();
    	
    	File reportFileJasper = new File(getServletConfig().getServletContext() .getRealPath("/reports/"+nomeJasper));
        byte[] bytes = null;

        try {
        	bytes = JasperRunManager.runReportToPdf(reportFileJasper.getPath(), parametros, con);

        	res.setContentType("application/pdf");
        	res.setContentLength(bytes.length);

        	servletOutputStream.write(bytes, 0, bytes.length);
        	servletOutputStream.flush();
        	servletOutputStream.close();
        } catch (JRException e) {
        	StringWriter stringWriter = new StringWriter();
        	PrintWriter printWriter = new PrintWriter(stringWriter);
        	e.printStackTrace(printWriter);
        	res.setContentType("text/plain");
        	res.getOutputStream().print(stringWriter.toString());
        };
V

Nó amigo, obrigado mesmo por responder !!!

Tó na labuta aqui com isso ! e pesquisei na NET parece que tem outras pessoas com este problema tb !

Eu utilizo via WEB !!!

Veja a imagem do meu sistema !

Agora estou fazendo assim :

sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				
				Map parameters = new HashMap();  
		        JasperFillManager.fillReportToFile("src\\org\\sindieletro\\relatorios\\filiacao.jasper",  
				                 parameters,jrRS);  
		        JasperExportManager.exportReportToPdfFile("src\\org\\sindieletro\\relatorios\\filiacao.jrprint");  
				JasperViewer.viewReport("src\\org\\sindieletro\\relatorios\\filiacao.pdf", false);

Mas mesmo assim tá vindo erro de localização …

Qualquer ajuda valerá viu !

vimieiro

D

[color=green]Olá.

Experimente utilizar o código que passei acima, ele pode substituir todo o seu.

Somente nesta linha, você coloca o caminho específico à partir da pasta src.[/color]

File reportFileJasper = new File(getServletConfig().getServletContext() .getRealPath("/org/sindieletro/relatorios/"+nomeJasper));
mateusprado

Adriano, posta o screen da sua estrutura de pacotes ai.
Esse é um problema que muitos passam. e eu estou passando no momento tb.rss

abraços a todos,

V

Mateus, quem tá com o “pepino” sou eu Vimieiro

a imagem do meu projeto, pacotes está logo ali acima hehehe

Aqui, vi que vc está com um problema parecido com meu né ? Vc fez o report porém ele vem sem registro nenhum !!! Estou com isso tb heheheh, mas este problema dele nem ao menos encontrá-lo é mais urgente !!!

Uma onça de cada vez rsrsrsrsr

Um Forte abraço companheiro de sofrimento …

vimieiro

D

[color=green]Olá.

A estratura é assim:[/color]

Projeto
  src
  reports
  WEB-INF

[color=green]Dessa forma o getServletConfig().getServletContext().getRealPath retornará a pasta principal do seu projeto, aí basta especificar o caminho onde estão localizados os jasper.

Espero que isso possa ajuda-los. Até.[/color]

V

Então vou reorganizar a pasta relatorios …

Vamos ver

Vimieiro :oops:

V

Nó, tá quase !!! hehehehe

Reorganizei meus pacotes, agora a pasta REPORTS (renomeei tb por desencargo) está logo abaixo da pasta WebContents e ele agora está localizando (Ufa)

Meu código ficou assim :

public void geraFichaFiliacao(Connection con,File file) throws JRException {
			sb = new StringBuffer();
			try {
				sb.append("select * from filiacao");
				stmt = con.prepareStatement(sb.toString());
				rs = stmt.executeQuery();
				JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
				
				Map parameters = new HashMap();  
				String extensaoJasper = ".jasper";
				String extensaoJrprint = ".jrprint";
				String extensaoPdf = ".pdf";
				
		        JasperFillManager.fillReportToFile(file.getPath()+ extensaoJasper,  
				                 parameters,jrRS); 
		        JasperExportManager.exportReportToPdfFile(file.getPath()+ extensaoJrprint);  
				JasperViewer.viewReport(file.getPath()+ extensaoPdf, false);
				
			} catch (NullPointerException en) {
				en.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

Ele tá gerando o PDF mas não me mostra e aparece o seguinte erro :

INFO: Initializing Coyote HTTP/1.1 on http-8080
08/07/2008 10:53:18 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 859 ms
08/07/2008 10:53:18 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
08/07/2008 10:53:18 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.25
08/07/2008 10:53:18 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
08/07/2008 10:53:19 org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
08/07/2008 10:53:19 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
08/07/2008 10:53:19 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/32  config=null
08/07/2008 10:53:19 org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
08/07/2008 10:53:19 org.apache.catalina.startup.Catalina start
INFO: Server startup in 828 ms
net.sf.jasperreports.engine.JRException: Error loading object from file : C:\Sun\JAVA\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\sindieletro\reports\filiacao.pdf
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:92)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:64)
	at net.sf.jasperreports.view.JRViewer.loadReport(JRViewer.java:1417)
	at net.sf.jasperreports.view.JRViewer.<init>(JRViewer.java:253)
	at net.sf.jasperreports.view.JRViewer.<init>(JRViewer.java:224)
	at net.sf.jasperreports.view.JasperViewer.<init>(JasperViewer.java:142)
	at net.sf.jasperreports.view.JasperViewer.viewReport(JasperViewer.java:409)
	at net.sf.jasperreports.view.JasperViewer.viewReport(JasperViewer.java:340)
	at org.sindieletro.socios.dao.FiliacaoDAO.geraFichaFiliacao(FiliacaoDAO.java:134)
	at org.sindieletro.socios.servlet.FiliacaoSL.doPost(FiliacaoSL.java:87)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	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:151)
	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(Unknown Source)
Caused by: java.io.StreamCorruptedException: invalid stream header: 25504446
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:87)
	... 25 more

Eu sei que ele está gerando o PDF corretamente pois consigo ver o arquivo gerado lá no C:\Sun\JAVA.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\sindieletro\reports\filiacao.pdf

Alguem tem ideia do que pode estar acontecendo ?

Tô quase !

vimieiro

Ah, colega Adriano, infelizmente não consegui fazer aquele código seu que gera o PDF em tempo de execução ( :cry:

D

[color=green]Olá.

Acredito que seja necessário colocar true nesta opção:[/color]

JasperViewer.viewReport(file.getPath()+ extensaoPdf, true);

[color=green]Somente como um “quebra-galho”, você pode testar as seguintes linhas de código:[/color]

// Compila o Relatorio.
String arquivoJasper = "relatorio.jasper";
impressao = JasperFillManager.fillReport(arquivoJasper, map, con);

// Gera o pdf.
String destFileName = "C:\\relatorio.pdf";
JasperExportManager.exportReportToPdfFile(impressao,destFileName);

// Abre o Relatorio.
String comando = "C:\\Arquivos de programas\\Foxit Software\\Foxit Reader\\Foxit Reader.exe ";
Runtime.getRuntime().exec(comando+destFileName);

[color=green]Na parte onde ele abre o relatório, você deve especificar o caminho de seu programa padrão para abrir PDFs, seja o Acrobat Reader, Foxit Reader, etc.

Ainda sim, acredito que você deva investir em arrumar a opção de enviar os relatórios diretamente ao cliente, através do OutputStream.

Até.[/color]

V

Adriano, blz eu concordo com vc neste ponto .

Como estou utilizando via WEB, eu não posso especificar a pasta que o meu cliente vai ter instalado o reader dele por exemplo. Eu realmente não sei como vcs fazem …

Mas sinceramente me enrolei todo pois no código que me passou, o HttpRequest não tem o método setContentType(“application/pdf”) nem getOutputStream()
Você me indicou não misturar os dois códigos, mas não consegui fazer o seu, embora acho show de bola !

Como posso adaptar ?

Vimieiro

D

[color=green]Olá.

Na verdade quem contém os métodos setContentType() e o getOutputStream(), é o HttpServletResponse, testa ele aí, tem que dar certo !

Até;[/color]

mateusprado

eai vimieiro, alguma novidade?

Criado 4 de julho de 2008
Ultima resposta 9 de jul. de 2008
Respostas 27
Participantes 6