PROBLEMA COM GERAÇÃO DE PDF VIA JASPER JasperRunManager.runReportToPdf

13 respostas
R

Pessoal,

Já estou a um tempo pesquisando em diversos lugares porem sem sucesso,
agora peço a ajuda de vocês POR FAVOR.

Na geração do meu pdf via iReport estou tendo nullpointer.
O local do .jasper esta correto na aplicação.

estou usando o iReport-4.7.0

//CLASSE GERA PDF
	public static void enviarArquivoPdf(HttpServletResponse response,
			JasperReport jasperReport, Map parametros, List lista,String nomeArquivo)
			throws JRException, IOException {
		
		JRDataSource dataSource = new JRBeanCollectionDataSource(lista);
		
		System.out.println("jasperReport - "+jasperReport);
		System.out.println("parametros - "+parametros);
		System.out.println("dataSource - "+dataSource);
		
		byte[] pdfEmFormatoBytes = JasperRunManager.runReportToPdf(jasperReport, parametros, dataSource);
		
		response.setContentType("application/pdf");
		response.setHeader("Content-Disposition", "attachment; filename=" + nomeArquivo);
		response.setContentLength(pdfEmFormatoBytes.length);

		ServletOutputStream ouputStream = response.getOutputStream();
		ouputStream.write(pdfEmFormatoBytes);
		ouputStream.flush();
		ouputStream.close();
	}
JARS UTILIZADOS:
commons-beanutils-1.8.0.jar
commons-collections-3.2.jar
commons-digester-1.8.jar
commons-logging.jar
groovy-all-1.7.5.jar
itext-2.1.7.jar
jasperreports-3.0.0.jar
ERRO
[14/08/12 10:13:53:643 ACT] 000002d1 SystemErr     R java.lang.NullPointerException
[14/08/12 10:13:53:643 ACT] 000002d1 SystemErr     R 	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
[14/08/12 10:13:53:643 ACT] 000002d1 SystemErr     R 	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
[14/08/12 10:13:53:643 ACT] 000002d1 SystemErr     R 	at net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:419)
[14/08/12 10:13:53:643 ACT] 000002d1 SystemErr     R 	at br.com.intermedica.commonjasper.RelatorioUtil.enviarArquivoPdf(RelatorioUtil.java:139)

DESDE JÁ
MUITO OBRIGADO

13 Respostas

D

O que tem neste linha 139?

br.com.intermedica.commonjasper.RelatorioUtil.enviarArquivoPdf(RelatorioUtil.java:139)
Aliás, chuto que seja um destes que está nulo: jasperReport, parametros, dataSource

R

e ai cara blz,

então ao meu ver não estão, seguem os prints dos 3 que estou passando, olhe só:

SystemOut O jasperReport - net.sf.jasperreports.engine.JasperReport@f820f82 SystemOut O parametros - {net.sf.jasperreports.text.truncate.at.char=true} SystemOut O dataSource - net.sf.jasperreports.engine.data.JRBeanCollectionDataSource@6d8a6d8a

a linha 139 se refere a linha 13 do metodo que gera o pdf.

abs

D

Qual a linha?

R

a linha 139 se refere a linha 13 do metodo que gera o pdf.

D
Roberto Porto:
a linha 139 se refere a linha 13 do metodo que gera o pdf. abs
Uma linha vazia?
//CLASSE GERA PDF  
    public static void enviarArquivoPdf(HttpServletResponse response,  
            JasperReport jasperReport, Map parametros, List lista,String nomeArquivo)  
            throws JRException, IOException {  
          
        JRDataSource dataSource = new JRBeanCollectionDataSource(lista);  
          
        System.out.println("jasperReport - "+jasperReport);  
        System.out.println("parametros - "+parametros);  
        System.out.println("dataSource - "+dataSource);  
          
        byte[] pdfEmFormatoBytes = JasperRunManager.runReportToPdf(jasperReport, parametros, dataSource);  
          //linha 13
        response.setContentType("application/pdf");  
        response.setHeader("Content-Disposition", "attachment; filename=" + nomeArquivo);  
        response.setContentLength(pdfEmFormatoBytes.length);  
  
        ServletOutputStream ouputStream = response.getOutputStream();  
        ouputStream.write(pdfEmFormatoBytes);  
        ouputStream.flush();  
        ouputStream.close();  
    }
R

Me desculpe drsmachado, me refiro a linha 12.

os parâmetros não estão nulos, não consegui entender o que esta ocorrendo =/

R

Roberto Porto:
Me desculpe drsmachado, me refiro a linha 12.

No map eu seto uma variável mas não estou usando ela no iReport.

Os parâmetros não estão nulos, não consegui entender o que esta ocorrendo =/

DESDE JÁ OBRIGADO

D

Eu ainda insisto que algum dos valores está nulos.
Por que não efetua um debug e confere se TODOS os atributos que são recebidos não estão nulos.
Note que você já testa dataSource quando ele está criado e não verifica se a lista foi recebida nula…

R

Tens razão drsmachado, vou verificar como essa lista esta vindo para mim e ja te informo!

Obrigado

R

drsmachado fiz os testes necessários, não vejo nenhum nada nulo ou vázio, apenas, porem eu não utilizo ele.
teria alguma influencia? seguem como eles estão vindo para mim.

14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O lista.size() - 1 [14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O lista - [br.com.guias.vo.GuiaInternacaoVO@58045804] [14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O lista.size() - 1 [14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O jasperReport - net.sf.jasperreports.engine.JasperReport@498c498c [14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O parametros - {} [14/08/12 13:49:59:038 ACT] 000002d6 SystemOut O parametros.size() - 0

Grato

R

fiz o tratamento, entra na condição mas ainda da null pointer

//gera pdf
	public static void enviarArquivoPdf(HttpServletResponse response,
			JasperReport jasperReport, Map parametros, List lista, String nomeArquivo)
			throws JRException, IOException {
			
		if(lista!=null && lista.size()>0 && jasperReport!=null){
					
			JRDataSource dataSource = new JRBeanCollectionDataSource(lista);
							
			byte[] pdfEmFormatoBytes = JasperRunManager.runReportToPdf(jasperReport, parametros, dataSource);
			
				System.out.println("pdfEmFormatoBytes - "+pdfEmFormatoBytes);
				
				response.setContentType("application/pdf");
				response.setHeader("Content-Disposition", "attachment; filename=" + nomeArquivo);
				response.setContentLength(pdfEmFormatoBytes.length);
		
				ServletOutputStream ouputStream = response.getOutputStream();
				ouputStream.write(pdfEmFormatoBytes);
				ouputStream.flush();
				ouputStream.close();
		
		}
	}
D

O método runReportToPDF é um método estático, logo, não pode ser o objeto de JasperRunManager que está nulo.
O que resta, então?
Os parâmetros.
Pelo que vi, você não é adepto do uso do debug, certo? Pois usou System.out.println para exibir os dados.
Creio que com um debug bem minucioso, você consiga encontrar onde ocorre o problema.

D

Então, fiz uns testes aqui, tenho uma servlet que faz quase a mesma coisa (ela cria um gráfico junto).
Passei um objeto null dentro da lista que cria o JRBeanCollectionDataSource, porém, não recebi NPE.
Verificando, estou usando uma versão bem antiga do iReport.
Comparando os jars, tive a surpresa:

commons-beanutils-1.8.0.jar  
commons-collections-3.2.jar  
commons-digester-1.8.jar  
commons-logging.jar  
groovy-all-1.7.5.jar  
itext-2.1.7.jar  
jasperreports-3.0.0.jar

Meu jasperreports é da versão 3.7.2 e, o teu, incrivelmente, é da versão 3.0.0!!!

Pode ser que não tenha nada a ver, mas pode ser incompatibilidade deste jar com os demais.

Criado 14 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 13
Participantes 2