我想使用servlet,.jasper文件创建pdf格式的报告,但有一个例外:
HTTP状态500 - Servlet执行引发异常
-------------------------------------------------------------------------------- type Exception report message Servlet execution threw an exception description The server encountered an internal error that prevented it from fulfilling this request. exception
javax.servlet.ServletException:Servlet执行引发异常
根本原因
java.lang.NoClassDefFoundError: 净/平方英尺/ JasperReports的/发动机/ JasperRunManager one.Patient.doGet(Patient.java:46) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
注意Apache中提供了根本原因的完整堆栈跟踪 Tomcat / 7.0.34日志。
servlet代码是:
package one;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.HashMap;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.JasperRunManager;
/**
* Servlet implementation class Patient
*/
@WebServlet("/Patient")
public class Patient extends HttpServlet implements Servlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Patient() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Connection con=DBCon.getConnection();
InputStream inS=getServletContext().getResourceAsStream("/report-src/ganeshaji.jashper");
OutputStream outS=response.getOutputStream();
response.setContentType("application/pdf");
try {
JasperRunManager.runReportToPdfStream(inS, outS, new HashMap<String, Object>(),con);
outS.flush();
con.close();
} catch (Exception e) {
// TODO Auto-generated catch block
response.setContentType("text/html");
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
请。为我提供解决方案
答案 0 :(得分:2)
通过调查根本原因
java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JasperRunManager
好像你要么错过了jasper jar,要么错误的版本不支持JasperRunManager。
在类路径中包含适当的jar将解决您的问题。
请下载这些罐子:
itext-4.2.0.jar
itextpdf-5.3.4.jar
jasperreports-4.0.1.jar
jasperreports-fonts-4.0.0.jar
并编写如下代码:
try {
FileInputStream fis = new FileInputStream(YOURREPORTPATH.jasper");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fis);
jasperReport = (JasperReport) JRLoader.loadObject(bufferedInputStream);
} catch (Exception e2) {
e2.printStackTrace();
}
然后在填充参数和数据源之后创建pdf,如下所示:
JasperExportManager.exportReportToPdfFile(jasperPrint, OUTPUTFILENAME+".pdf");
...谢谢
Mr.777
答案 1 :(得分:0)
检测到在NoClassDefFoundError之前抛出的根异常:net / sf / jasperreports / engine / util / JRStyledTextParser:
java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
Unix和Linux上的Sun AWT课程依赖于X Window系统。当您使用这些类时,他们希望加载X客户端库并能够与X显示服务器通信。如果您的客户端有GUI,这是有意义的;不幸的是,即使您的客户使用AWT但没有GUI(这是我的情况,从Web应用程序生成报告),它也是必需的
绕过此方法的方法是在系统启动时设置系统属性java.awt.headless=true
。
例如
让java尽可能早地执行静态块,将其移到类的顶部!
public class Foo() {
static { /* works fine! ! */
System.setProperty("java.awt.headless", "true");
}
public static void main() {}
}
或强>
我认为可以通过将其作为参数传递给Java虚拟机来设置此参数,例如
-Djava.awt.headless =真。不确定这是否会对您应用程序的其他组件产生影响。
或强>
尝试将其放入$ {CATALINA_HOME} /bin/catalina.sh脚本中:
export JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true"