Jasper, iReports, servlets, erros, etc

20 respostas
T

Oi galera, td bem. Eu sou novo tanto no forum quanto na linguagem JAVA e tudo que ela pode oferecer. Eu estou tendo que criar uma mini aplicação web que gera uns relatorios. Eu estou usando servlet e iReports (JASPER) e o TOMCAT.
quando eu clico no botao de gerar o relatorio, o servlet pega um Hash Table da sessao do usuario e manipula esta tabela para gerar o relatorio que eu quero. O codigo que eu uso no servlet eh o seguinte:

import java.sql.<em>;

import <a href="http://java.io">java.io</a>.</em>;

import java.util.<em>;

import javax.servlet.</em>;

import javax.servlet.http.<em>;

import net.sf.jasperreports.engine.</em>;

import net.sf.jasperreports.engine.util.*;



try

{ //pega a HashTable da sessao

ht = (Hashtable) sessao.getAttribute(ht);

JREmptyDataSource jrRS = new JREmptyDataSource();

//relatorio compilado

InputStream jp = getServletContext().getResourceAsStream("/Declaracao.jasper");

JasperReport relatorio = (JasperReport) JRLoader.loadObject(jp);

JasperPrint impressao = JasperFillManager.fillReport(relatorio,ht,jrRS); //aqui que dá a exception

JasperExportManager.exportReportToPdfFile(impressao,Caminho a ser gerado);

RequestDispatcher rd;

rd = getServletContext().getRequestDispatcher("/Declaracao.pdf");

rd.forward(p_request,p_response);

}

catch (JRException e2) {System.out.println("Jasper Reports Exception: "); e2.printStackTrace();}

catch (Exception e) {System.out.println("Exception Normal: " ); e.printStackTrace();}

return;
O erro que eu vejo é o seguinte:

Exception Normal:

java.lang.NullPointerException

at java.util.Hashtable.put(Unknown Source)

at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:603)

at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:160)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:472)

at ServletDeclaracao.doGet(ServletDeclaracao.java:293)

at ServletDeclaracao.doPost(ServletDeclaracao.java:423)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419)

at org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:169)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:17

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:14

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)

at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

at java.lang.Thread.run(Unknown Source)

Alguém pode me dar uma dica do que esta acontecendo??

Desde ja eu agradeço

20 Respostas

R

acho q esse seu ht tá null …

T

Ta nao…eu fiz uma versão aqui que imprime uns campos do ht. ele imprime os valores belezinha.
O problema ta naquele comando em que tem o comentario que da pau…nao descobri ate agora.

R

entaum dá uma analisada nos outros paramêtros q vc tá passando (relatorio e jrRS) … pois, ele tá reclamando q existe algum objeto/variável null !!!

T

Mas o mais intrigante é que eu fiz uma versão pra rodar local. Independente do TOMCAT e continuou dando o mesmo pau…nao to entendendo bulhufas…
segue o codigo que eu fiz local:
/*

  • Teste_Local.java
  • Created on 23 de Maio de 2005
    */
import java.sql.<em>;

import <a href="http://java.io">java.io</a>.</em>;

import java.util.<em>;

import javax.servlet.</em>;

import javax.servlet.http.<em>;

import net.sf.jasperreports.engine.</em>;

import net.sf.jasperreports.engine.util.*;

import java.net.URL;

import net.sf.jasperreports.view.JasperViewer;

public class Teste_Local {

public void geraRelatorio(Hashtable ht) throws JRException, Exception

{

System.out.println(1);

System.out.println("nome: " + ht.get(nome));

System.out.println("cpf: " + ht.get(cpf));

System.out.println("cidade: " + ht.get(cidade));

System.out.println(2);

JREmptyDataSource RS = new JREmptyDataSource();
System.out.println("3");
System.out.println("4");
JasperReport relatorio = (JasperReport) JRLoader.loadObject("C:\\Arquivos de programas\\Apache Software Foundation\\Tomcat 5.5\\webapps\\testes_exemplos\\Declaracao.jasper");
System.out.println("5");
JasperPrint impressao = new JasperPrint();
System.out.println("6");
impressao =  JasperFillManager.fillReport(relatorio,ht,RS);
System.out.println("7");
JasperExportManager.exportReportToPdfFile(impressao,"C:\\Arquivos de programas\\Apache Software Foundation\\Tomcat 5.5\\webapps\\testes_exemplos\\Declaracao.pdf");
JasperViewer.viewReport( "C:\\Arquivos de programas\\Apache Software Foundation\\Tomcat 5.5\\webapps\\testes_exemplos\\Declaracao.pdf", false );

}

public static void main(String[] args) throws JRException, Exception
{

Hashtable ht = new Hashtable();
ht.put("conj","321321321");
ht.put("nome", "Fernando Aprobets");
ht.put("rg", new Long(252678));
ht.put("cpf", new Long[telefone removido]));
ht.put("codimob", new Long(321231));
ht.put("nomeconj", "Teste");
ht.put("cidade", "Ribeirão Preto");
ht.put("endereco","Rua Cert Port");
ht.put("numero","432");
ht.put("cep","14030-015");
ht.put("apartamento","29");
ht.put("bloco","A");
ht.put("conj","276");
ht.put("dataret","21/06/2001");
ht.put("fone","6262478");
ht.put("area","16");

new Teste_Local().geraRelatorio(ht);

}

}

R

q editor cê tá usando ???
… cê num consegue debugar o código para pegar qual é o obj null ???

T

To usando o JCreator…

Desculpe a ignorancia, mas como faz pra debugar dessa forma? pelo editor tem jeito ou soh na mao mesmo (dando umas opções pro executavel do java).

R

bem, se naum me engano, essa opção está habilitada apenas para a versão professional … se for a sua, aí vai:

Ctrl + F5 >> para iniciar em modo de Debug
F10 >> Step
F11 >> Step Into
Shift + F11 >> Step out
Ctrl + F10 >> Continue
F9 >> adicionar Breackpoint

R

bem, se naum me engano, essa opção está habilitada apenas para a versão professional … se for a sua, aí vai:

Ctrl + F5 >> para iniciar em modo de Debug
F10 >> Step
F11 >> Step Into
Shift + F11 >> Step out
Ctrl + F10 >> Continue
F9 >> adicionar Breackpoint

flw!

T

Vc tem razão…eh soh pra versão PRO. Eu to usando a Free, que nao tem opção de debug. Eu baixei um outro IDE, Gel, que tem opção.
Eu fiz uns testes aqui e nao tem nada de errado, aparentemente. Mas o erro continua. De acordo com o debug ele tenta fazer uns parses, e aí que ele coloca os valores nulos. Mas quando vc dá um watch nas variáveis, elas parecem normais.

Veja um pequeno trecho do debug:

main[1] relatorio = “net.sf.jasperreports.engine.JasperReport@530cf2”
impressao = “net.sf.jasperreports.engine.JasperReport@530cf2”
main[1] rs = “net.sf.jasperreports.engine.JasperReport@530cf2”
main[1] main[1] step

Step completed: “thread=main”, net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(), line=363 bci=0
print rs
print relatorio
print impressao

main[1] com.sun.tools.example.debug.expr.ParseException: Name unknown: rs
rs = null
com.sun.tools.example.debug.expr.ParseException: Name unknown: relatorio
relatorio = null
com.sun.tools.example.debug.expr.ParseException: Name unknown: impressao
impressao = null
main[1] main[1] main[1]

R

… se até o resultset tá null … eu daria uma olhada no con

T

Mas eu nao estou usando Result Set e nenhuma conexão. Estou usando um JREmptyDataSource e uma HashTable.

olha o codigo:

/*
 * Teste.java
 *
 * Created on 23 de Maio de 2005
 */

import java.sql.*;
import java.io.*;
import java.util.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.*;
import net.sf.jasperreports.view.JasperViewer;


public class Teste{

public void geraRelatorio(Hashtable ht) throws JRException, Exception
{

  try{
  	JREmptyDataSource rs = new JREmptyDataSource();
  	//System.out.println("jrRS: " + jrRS);
  	//InputStream jp = getServletContext().getResourceAsStream("Declaracao.jasper");
  	//System.out.println("jp: " +  jp);
  	JasperReport relatorio = (JasperReport) JRLoader.loadObject("C:\CELSO\Declaracao.jasper");
  	//JasperReport relatorio = JasperManager.loadReport("C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\testes_exemplos\Declaracao.jasper");
  	JasperPrint impressao = new JasperPrint();
  	//impressao =  JasperFillManager.fillReport(relatorio,ht,RS);
  	impressao =  JasperFillManager.fillReport(relatorio,ht,rs);
  	//JasperFillManager.fillReportToFile(relatorio,"C:\CELSO\Declaracao.jasperprint",ht,rs);
  	JasperExportManager.exportReportToPdfFile(impressao,"C:\CELSO\Declaracao.pdf");
  	//JasperViewer.viewReport( "C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\testes_exemplos\Declaracao.pdf", false );
  	}
  catch (JRException e2) {System.out.println("Jasper Reports Exception: "); e2.printStackTrace();}
  catch (Exception e) {System.out.println("Exception Normal: " ); e.printStackTrace();}
  return;

}


public static void main(String[] args) throws JRException, Exception
{

    Hashtable ht = new Hashtable();
    ht.put("conj","321321321");
	ht.put("nome", "Fernando Aprobets");
	ht.put("rg", new Long(252678));
	ht.put("cpf", new Long[telefone removido]));
	ht.put("codimob", new Long(321231));
	ht.put("nomeconj", "Teste");
	ht.put("cidade", "Ribeirao Preto");
	ht.put("endereco","Rua Cert Port");
	ht.put("numero","432");
	ht.put("cep","14030-015");
	ht.put("apartamento","29");
	ht.put("bloco","A");
	ht.put("conj","276");
	ht.put("dataret","21/06/2001");
	ht.put("fone","6262478");
	ht.put("area","16");

    new Teste().geraRelatorio(ht);

 }

}

olha a exception:

java.lang.NullPointerException
				at java.util.Hashtable.put(Hashtable.java:396)
				at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:603)
				at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:160)
				at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:472)
				at Teste.geraRelatorio(Teste.java:29)
				at Teste.main(Teste.java:62)

[color=“red”]* Editado - use a tag Code em seus códigos[/color]

M

vc não pode inserir valores nulos em uma Hashtable, em algum lugar esse JREmptyDataSource ta fazendo isso, debugue esse teu código pra checar o valor de cada variável e chamada a método, em algum lugar tem um null ai…

R

Ah sim !!!

… se experimentou colocar um ht.get() assim dentro do geraRelatorio ???
se naum … coloca e chama todos os atributos q estão nele … prá ver se algum retorna null …

T

Oi galera. blz ?
É o seguinte. Eu baixei a versão mais nova do iReports, a versão (0.5.0),
e deu tudo certo. Eu nao mudei nenhuma linha do codigo. A unica coisa que eu alterei foi o CLASSPATH, mais nada. O arquivo PDF foi gerado perfeitamente. Agora o porquê disso acontecer nao me perguntem. :smiley:
De qualquer forma, muito obrigado pela atenção de vcs. Brigadão mesmo. Vcs foram super gente - fina.
Precisando de alguma coisa estamos aí.

Um abraço a todos.

T

Ae galera…sou eu de novo!!! :grin:
Seguinte. Eu consegui gerar o relatorio pdf belezinha na minha maquina. Eu soh nao consegui chamar o preview ainda…mas gerar o arquivo eu ainda nao consegui. Mas agora eu estou tentando utilizar essa bagaça pra gerar um arquivo num servlet. E agora ta dando erro no metodo que exporta o arquivo jasperprint para PDF. Nao sei porque…o TOMCAT joga um erro nada a ver…

Olha meu codigo:

import java.sql.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.*;
import java.net.URL;
...
...
public void doGet(HttpServletRequest p_request, HttpServletResponse p_response) throws IOException
...
...
	       	     try
	           	  {
	           	  	ht = (Hashtable) sessao.getAttribute("ht");
	              	JREmptyDataSource RS = new JREmptyDataSource();
	               	//InputStream jp = getServletContext().getResourceAsStream("Declaracao.jasper");
	              	JasperReport relatorio = (JasperReport) JRLoader.loadObject("C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\testes_exemplos\Declaracao.jasper");
	              	JasperPrint impressao = new JasperPrint();
	              	impressao =  JasperFillManager.fillReport(relatorio,ht,RS);
	              	System.out.println("Passou pelo Fill; impressão: " + impressao);
	              	JasperExportManager.exportReportToPdfFile(impressao,"C:\CELSO\Declaracao_SERVLET.pdf");//aqui que da pau!!!!
	              	RequestDispatcher rd;
	              	rd = getServletContext().getRequestDispatcher("C:\Arquivos de programas\Apache Software Foundation\Tomcat 5.5\webapps\testes_exemplos\Declaracao.pdf");
	              	rd.forward(p_request,p_response);
	              	//p_request.getRequestDispatcher("/Uso_Imovel.jsp").forward(p_request,p_response);
	              }
	              catch (JRException e2) {System.out.println("Jasper Reports Exception: "); e2.printStackTrace();}
				  catch (Exception e) {System.out.println("Exception Normal: " ); e.printStackTrace();}

				  return;

o erro que da no TOMCAT eh o seguinte:

java.lang.NoClassDefFoundError: com/lowagie/text/Image
net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:121)

Será que ta faltando algum JAR ou algum import???
Alguem tem uma luz???

[]´S

R

vc mudou o classpath, neh ?
… será q o q vc alterou naum tá implicando nisso aí !?!

T

pois eh…pode ate ser…
mas o que eu mudei foi a versão do iReports…soh isso…

T

vcs sabem que tipo de erro que eh esse que da no log do TOMCAT??
Acho que eh por isso que nao to conseguindo gerar o PDF.

SEVERE: IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: net.sf.jasperreports.engine.JRDefaultScriptlet
T

Fala galera, blz???

Seguinte, eu até estou conseguindo gerar o relatorio .PDF soh que eu nao estou conseguindo é fazer o IE abrir o arquivo. Quando eu dou um “getServletContext().getRequestDispatcher” abre uma janela em branco, mas o arquivo está lá. Alguém tem uma luz??

Valeu

T

Fala pessoal!! Sou eu de novo :razz:

Eu consegui gerar o relatorio e dar um sendRedirect nele…belezinha. Mas o problema eh que da maneira como o servlet esta construido, é gerado 1 arquivo PDF no servidor, pra cada requisição. O que nao eh legal. Vai que em 1 dia sao geradas 10000 requisições, entao teremos 10000 arquivos PDF. Entao tentei alterar o servlet pra gerar um stream. Mas nao consegui nada. ele gera uma pagina em branco. O que pode ser? Alguem tem uma luz?
Abraços

Segue o codigo

try
{
     Hashtable matriz = (Hashtable) sessao.getAttribute("ht");
     JREmptyDataSource RS = new JREmptyDataSource();
     InputStream jp = getServletContext().getResourceAsStream("/Declaracao.jasper");
     JasperReport relatorio = (JasperReport) JRLoader.loadObject(jp);
     JasperPrint impressao = new JasperPrint(); //VERSÃO OFICIAL
     p_response.setContentType("application/pdf");
     impressao =  JasperFillManager.fillReport(relatorio,matriz,RS); 
     byte[] buffer = JasperExportManager.exportReportToPdf(impressao);
     ServletOutputStream outputStream = p_response.getOutputStream();
     outputStream.write(buffer, 0, buffer.length);
     outputStream.flush();
     outputStream.close();
  }
Criado 23 de maio de 2005
Ultima resposta 30 de mai. de 2005
Respostas 20
Participantes 3