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…
package Relatorios;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
public class Relatorios extends HttpServlet {
public static Connection con;
public static String banco = "banco"; // Nome do banco de dados
public static String usuario = "usuario"; // Usuario do banco
public static String senha = "senha"; // Senha
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String datainicial = req.getParameter("dataini");
String datafinal = req.getParameter("datafim");
conexao(); // Faz a conexão
// Na variavel pathJasper ficara o caminho do diretório para
// os relatórios compilados (.jasper)
String pathJasper = 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 diferentes
String path = getServletContext().getRealPath("/");
// Parametros do relatorio
Map 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 pdf
JasperManager.printReportToPdfFile(impressao, path
+ "/RelatorioLivros.pdf");
// Redireciona para o pdf gerado
res.sendRedirect("RelatorioLivros.pdf");
} catch (Exception e) {
res.getWriter().println("Erro ao gerar o relatório: " + e);
}
}
// Cria a conexão
public 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 (Exception e) {
System.out.println("não foi possível conectar ao banco ->");
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
doPost(arg0, arg1);
}
}
Podem ser muitas coisas…
Manda o StackTrace (coloca um printStacktrace() ) da Exception original, a que foi propagada pelo Servlet não diz muita coisa.
[]'s
net.sf.jasperreports.engine.JRException: java.lang.reflect.InvocationTargetException
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:
package Relatorios;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: FillServlet.java,v 1.1 2006/04/22 07:51:16 teodord Exp $
*/
public class Relatorios6 extends HttpServlet {
public static Connection con;
public static String banco = "revest"; // Nome do banco de dados
public static String usuario = "root"; // Usuario do banco
public static String senha = "root"; // Senha
public void doPost(
HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
ServletContext context = this.getServletConfig().getServletContext();
String datainicial = request.getParameter("dataini");
String datafinal = request.getParameter("datafim");
conexao();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
String reportFileName = context.getRealPath("/Relatorios/Faturamento.jrxml");
File reportFile = new File(reportFileName);
if (!reportFile.exists())
throw new JRRuntimeException("File WebappReport.jasper not found. The report design must be compiled first.");
Map parametros = new HashMap();
parametros.put("DATAINI", datainicial);
parametros.put("DATAFIM", datafinal);
parametros.put("CAMINHO", context.getRealPath("/Relatorios/soma.jrxml"));
//AGORA É AQUI QUE DÁ O ERRO
JasperPrint jasperPrint =
JasperFillManager.fillReport(
reportFileName,
parametros,
con
);
request.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
} catch (JRException e) {
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>");
}
public 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 (Exception e) {
System.out.println("não foi possível conectar ao banco ->");
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
doPost(arg0, arg1);
}
}
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.
Blz, vou testar aqui, valeu…
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…
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:
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
root cause
java.lang.NoClassDefFoundError
net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:147)
net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:57)
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:188)
net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:94)
Servlet.ServletCliente.doPost(ServletCliente.java:77)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
Alguém sabe o que pode ser?
o jar da ireport está na lib do projeto? ou na lib do tomcat?
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
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.
Acho que tá quase resolvendo! hehehehehe
Tem algum palpite?!
valeu.