Problema ao gerar Relatório Jasper

Oi pessoal!!!
Por favor me ajudem!!! Já estou com esse problema a mais de uma semana e não consigo resolver.

Aqui na aplicação temos um banco de dados que tem uma tabela de nome “pessoa”.
Ela possui os atributos idPessoa, Nome, Telefone, Logradouro e Cidade.

Então coloquei no meu Relatório no iReport os campos dinâmicos Nome, Telefone, Logradouro e Cidade.

Até aí tudo bem!

Então tenho que criar um servlet para gerar relatórios na página da aplicação.

E fiz o seguinte código:

[code]import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;
import sql.DBController;

public class MakeReport extends HttpServlet {

public static Connection con;
public static String banco = "odontosis"; // Nome do banco de dados
public static String usuario = "root"; // Usuario do banco
public static String senha = "admin"; // Senha

public void conexao() {
	try {
		if (con == null || con.isClosed()) {
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/" + banco, usuario, senha);
		}
	} catch (Exception e) {
		System.out.println("Não foi possível conectar ao banco ->");
		e.printStackTrace();
	}
}

protected void doPost(HttpServletRequest req, HttpServletResponse res)
				throws ServletException, IOException {
	
	conexao();
	
	String pathJasper = getServletContext().getRealPath("/WEB-INF/classes/jasper/") + "/";
	
	String path = getServletContext().getRealPath("/");
	
	Map parametros = new HashMap();
	
	parametros.put("idPessoa", new Integer(2));
	
	try {
		// Aqui ele cria o relatório
		JasperPrint impressao = JasperFillManager.fillReport(pathJasper+ "RelatorioTriagem.jasper", parametros, con);

		// Grava o relatório em disco em pdf
		JasperManager.printReportToPdfFile(impressao, path + "/RelatorioTriagem.pdf");
		
		// Redireciona para o pdf gerado
		res.sendRedirect("RelatorioTriagem.pdf");
	} 
	catch (Exception e) {
		res.getWriter().println("!Erro ao gerar o relatório: " + e);
		e.printStackTrace();
		
	}
}

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
			throws ServletException, IOException {
	doPost(arg0, arg1);
}[/code]

O problema é que na hora de gerar o relatório SEMPRE dá esse erro abaixo:

java.lang.NullPointerException
	at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
	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 java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readArray(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
	at java.io.ObjectInputStream.readSerialData(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:88)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:232)
	at application.MakeReport.doPost(MakeReport.java:64)
	at application.MakeReport.doGet(MakeReport.java:81)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Alguém POR fAVOR que souber como resolver isso me diga!!!

Qualquer duvida referente ao problema é só postar!!!

Desde já obrigado!!!

Beto,

Vc precisa mesmo salvar o pdf no servidor???? Pq senão for necessário troque o fillReport pelo JasperRunManager.runReportToPdf ...

 Tem um exemplo que o Adriano postou em:

http://www.guj.com.br/posts/list/96333.java

Espero ter ajudado,

T+

Bem,

Realmente eu não preciso guardar o relatório no servidor!
Eu preciso que ele seja gerado, apareça no browser e então seja impresso.

Vou tentar isso! Obrigado!

Ow galera!!!
Nada ainda!!! Pessoal quem puder me ajudar aí por favor contribua!
Vou explicar o que tenho q fazer!!!

Estou num projeto chamado Odontosis que e um sistema web para atendimento nas clínicas odontologicas aqui da minha universidade!
Então tenho que fazer com que, na hora em que um paciente seja cadastrado, eu possa gerar um relatorio para ser impresso com os dados pessoais do paciente!!
O banco de dados contem uma tabela pessoa com os atributos que são os dados pessoais de cada paciente cadastrado, tipo nome, telefone, cidade, endereco e idPessoa!!
No relatorio eu queria passar este idPessoa como parametro para que este relatorio seja gerado do paciente com aquele id!!

Quem tiver ideia de como fazer isso me ajude!!!

Obrigado aí!!!

Beto,

Esse é o código com que faço rodar meus relatórios:

Servlet:

                
                 String tipoConteudo="application/pdf";
                String nomeRelatorio= "nomeDoArquivoJasper";
                HashMap parametros=new HashMap();
                
                parametros.put("meu_parametro",1);

                try{
                    
                    byte[] docRelatorio = Relatorio.geraRelatorios(nomeRelatorio,parametros);
    
                     
                    if (docRelatorio!= null && docRelatorio.length > 0) {   
                        
                        response.setContentType(tipoConteudo);   
                        response.setContentLength(docRelatorio.length);   
                        ouputStream.write(docRelatorio, 0, docRelatorio.length);
                        
                        
                    }
                    
                } catch(Exception e){
                    
                    strJSPdestino = "Inicio.jsp";
                       
                    
                }

Relatorio.java


public class Relatorio {


    public static final String CAMINHO_RELATORIO = "E:/CAMINHO_DO_ARQUIVO_JASPER/";
   
    public static byte[] geraRelatorios(String nomeRelatorio, HashMap parameters) throws
                                                                                        Exception{           
        
        byte[] bytes = null;   
        
        // lendo arquivo jasper   
        JasperReport reportFile = (JasperReport) JRLoader.loadObject(CAMINHO_RELATORIO+nomeRelatorio+".jasper");   
        
        
//ConexaoBD é uma classe minha... 
        ConexaoBD con = new ConexaoBD();
        con.conectaBancoDados("MEU_BANCO");
        

        if (con.estaConectado())bytes = JasperRunManager.runReportToPdf(reportFile, parameters,con.getCon());   
        
        else throw (new Exception());
               
        return bytes;
    }
    
      
        
       
       
}

Aí vc precisa fazer com que o parâmetro de busca no relatório tenha o mesmo nome do que vc colocou no HashMap. Assim:

SELECT minha_tabela.meu_campo FROM minha_tabela WHERE campo = $P{meu_parametro}

Onde meu_parametro é aquele mesmo que pus no HashMap do servlet.