Estou começando a trabalhar com Ireport e Jasper, tenho dois relatórios feitos no Ireport que geraram dois arquivos .jasper que já estão no meu projeto.
Estou usando o servlet abaixo, está dando erro http 500:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet execution threw an exception org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
root cause
Quando compilei vi que o erro acontece quando tenta carregar o arquivo jasper. Marquei a linha do meu código onde a execução para. Alguém pode me dar uma luz? Ou mesmo me passar um Servlet que posso usar? Valeu…
packageRelatorios;importjava.io.IOException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importnet.sf.jasperreports.engine.JasperFillManager;importnet.sf.jasperreports.engine.JasperManager;importnet.sf.jasperreports.engine.JasperPrint;publicclassRelatoriosextendsHttpServlet{publicstaticConnectioncon;publicstaticStringbanco="banco";// Nome do banco de dadospublicstaticStringusuario="usuario";// Usuario do bancopublicstaticStringsenha="senha";// SenhaprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOException{Stringdatainicial=req.getParameter("dataini");Stringdatafinal=req.getParameter("datafim");conexao();// Faz a conexão// Na variavel pathJasper ficara o caminho do diretório para// os relatórios compilados (.jasper)StringpathJasper=getServletContext().getRealPath("/WEB-INF/classes/Relatorios")+"\";// A variavel path armazena o caminho real para o contexto// isso é util pois o seu web container pode estar instalado em lugares diferentesString path = getServletContext().getRealPath("/");// Parametros do relatorioMap parametros = new HashMap();// O único parametro que devemos passar é o PathRelAutores// é o caminho pro RelAutores.jasper (que foi subtituido pelo// valor fixo ?D:/iReport-0.4.0/RelAutores.jasper?)parametros.put("CAMINHO", pathJasper + "Soma.jasper");parametros.put("DATAINI", datainicial);parametros.put("DATAFIM", datafinal);try {// (AQUI ELE DÁ ERRO!!!!!!!!)JasperPrint impressao = JasperFillManager.fillReport(pathJasper+ "Faturamento.jasper", parametros, con);// Grava o relatório em disco em pdfJasperManager.printReportToPdfFile(impressao, path+ "/RelatorioLivros.pdf");// Redireciona para o pdf geradores.sendRedirect("RelatorioLivros.pdf");} catch (Exception e) {res.getWriter().println("Erroaogerarorelatório:" + e);}}// Cria a conexãopublic void conexao() {try {if (con == null || con.isClosed()) {Class.forName("com.mysql.jdbc.Driver");con = DriverManager.getConnection("jdbc:mysql://192.168.3.5:3306/" + banco, usuario, senha);}}catch(Exceptione){System.out.println("não foi possível conectar ao banco ->");e.printStackTrace();}}protectedvoiddoGet(HttpServletRequestarg0,HttpServletResponsearg1)throwsServletException,IOException{doPost(arg0,arg1);}}
Implementei em outro servlet deu o mesmo erro, só que neste servlet o catch me trouxe uma mensagem composta pelo desenvolvedor do mesmo. Dizendo que a aplicação não achou meu arquivo.jasper. O que pode ser? Alguém me de uma luz por favor???
código abaixo:
packageRelatorios;importjava.io.File;importjava.io.IOException;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.DriverManager;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importnet.sf.jasperreports.engine.JRException;importnet.sf.jasperreports.engine.JRRuntimeException;importnet.sf.jasperreports.engine.JasperFillManager;importnet.sf.jasperreports.engine.JasperPrint;importnet.sf.jasperreports.j2ee.servlets.BaseHttpServlet;/** * @author Teodor Danciu ([email removido]) * @version $Id: FillServlet.java,v 1.1 2006/04/22 07:51:16 teodord Exp $ */publicclassRelatorios6extendsHttpServlet{publicstaticConnectioncon;publicstaticStringbanco="revest";// Nome do banco de dadospublicstaticStringusuario="root";// Usuario do bancopublicstaticStringsenha="root";// SenhapublicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{ServletContextcontext=this.getServletConfig().getServletContext();Stringdatainicial=request.getParameter("dataini");Stringdatafinal=request.getParameter("datafim");conexao();response.setContentType("text/html");PrintWriterout=response.getWriter();try{StringreportFileName=context.getRealPath("/Relatorios/Faturamento.jrxml");FilereportFile=newFile(reportFileName);if(!reportFile.exists())thrownewJRRuntimeException("File WebappReport.jasper not found. The report design must be compiled first.");Mapparametros=newHashMap();parametros.put("DATAINI",datainicial);parametros.put("DATAFIM",datafinal);parametros.put("CAMINHO",context.getRealPath("/Relatorios/soma.jrxml"));//AGORA É AQUI QUE DÁ O ERROJasperPrintjasperPrint=JasperFillManager.fillReport(reportFileName,parametros,con);request.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);}catch(JRExceptione){out.println("<html>");out.println("<head>");out.println("<title>JasperReports - Web Application Sample</title>");out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"../stylesheet.css\" title=\"Style\">");out.println("</head>");out.println("<body bgcolor=\"white\">");out.println("<span class=\"bnew\">JasperReports encountered this error :</span>");out.println("<pre>");e.printStackTrace(out);out.println("</pre>");out.println("</body>");out.println("</html>");}out.println("<html>");out.println("<head>");out.println("<title>JasperReports - Web Application Sample</title>");out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"../stylesheet.css\" title=\"Style\">");out.println("</head>");out.println("<body bgcolor=\"white\">");out.println("<span class=\"bold\">The compiled report design was successfully filled with data.</span>");out.println("</body>");out.println("</html>");}publicvoidconexao(){try{if(con==null||con.isClosed()){Class.forName("com.mysql.jdbc.Driver");con=DriverManager.getConnection("jdbc:mysql://192.168.3.5:3306/"+banco,usuario,senha);}}catch(Exceptione){System.out.println("não foi possível conectar ao banco ->");e.printStackTrace();}}protectedvoiddoGet(HttpServletRequestarg0,HttpServletResponsearg1)throwsServletException,IOException{doPost(arg0,arg1);}}
Igor_Luiz1
Kara,
Já vi isso acontecer quando o kara utiliza um .war no tomcat, em vez de utilizar a aplicação “explodida”, ou seja, sem ser um war.
No caso o comando que vc utiliza
getServletContext().getRealPath("/WEB-INF/classes/Relatorios")
devolve null.
Debuga e ve se isso ocorre!
Se for tente pegar o arquivo da seguinte forma:
Use o servletContext.getResourceAsStream(“arquivo.jasper”) para localizar recursos.
Desta forma, independe se a aplicação está em um WAR ou descompactada.
fabianoat
Blz, vou testar aqui, valeu…
fabianoat
Cara, deu não, ele tá achando o arquivo legal. Das duas formas, na hora de carregar ele no JasperPrint ele dá erro. Já tentei até tirar os parâmetros pra ficar mais limpo, só pra testar, atualizei o Jasper pro 3.0, já experimentei alguns outros servlets, e nada!
Ele dá erro Http500 do tomcat. Com o mesmo printStackTrace abaixo…
fabianoat
Troquei o jar do commons de 2.0 pro 3.1, resolvido, ele achou a classe do ReferenceMap e já está imprimindo o relatório em JasperViewer, o usuário escolhe como vai salvar, pdf,excel,etc.
Mas agora, no tomcat do netbeans, roda, mas quando implanto o projeto, pego o .war e coloco no webapps do tomcat instalado no pc, ele dá o seguinte erro:
o jar da ireport está na lib do projeto? ou na lib do tomcat?
fabianoat
Tá na lib do projeto. Vou colocar na lib do tomcat também?
Coloquei e ainda dá erro. Todos meus JAR’s estão no lib do tomcat também, utilizo o tomcat 6.0.14
fabianoat
Coloquei o jar commons-logging1.0.2 no jar do tomcat e no lib do projeto. Resolveu. Agora o formato html imprime legal. Mas a opção de visualização no jasperviewer não dá nada. Ele aceita tudo, termina o processo, e não abre o viewer. O jar do jasper está nos dois lugares.