2013-02-25 99 views
0

我想用的servlet,.jasper文件,然后创建PDF格式的报表创建PDF格式的报告,但有一个例外用碧玉和servlet

HTTP Status 500 - Servlet execution threw an exception

-------------------------------------------------------------------------------- 

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 execution threw an exception

root cause

java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JasperRunManager one.Patient.doGet(Patient.java:46) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.34 logs.


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

检测到的根异常,将其NoClassDefFoundError的前抛出:净/ SF/JasperReports的/发动机/ UTIL/JRStyledTextParser:

java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment 

在Unix和Linux太阳AWT类对一个依赖X窗口系统。当您使用这些类时,他们希望加载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 = true。不确定这是否会影响应用程序的其他组件。

尝试把这个在你的$ {CATALINA_HOME} /bin/catalina.sh脚本:

export JAVA_OPTS="${JAVA_OPTS} -Djava.awt.headless=true" 

refered从 - https://stackoverflow.com/a/3651196/1602230

+0

先生,您可以详细说明如何在系统启动时设置系统属性java.awt.headless = true。 – 2013-02-25 12:54:10

+0

我在系统启动时在boot.ini中粘贴java.awt.headless = true。 – 2013-02-25 12:55:09

+0

@Neerajsingh看到更新的答案 – Sathish 2013-02-25 12:58:07

2

通过寻找到根源

java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JasperRunManager 

it好像你要么错过了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

+0

先生,我包括此JasperReports的-4.1.2.jar – 2013-02-25 12:40:36

+0

请下载这些罐子: iText的 - 4.2.0.jar itextpdf-5.3.4.jar JasperReports的-4.0.1。罐子 的JasperReports的字体-4.0.0.jar 和代码是这样的: 尝试{ \t \t \t \t的FileInputStream FIS =新的FileInputStream(YOURREPORTPATH.jasper“); \t \t \t \t BufferedInp utStream bufferedInputStream = new BufferedInputStream(fis); \t \t \t \t jasperReport =(JasperReport)JRLoader.loadObject(bufferedInputStream); \t \t \t}赶上(例外E2){ \t \t \t \t e2.printStackTrace(); \t \t \t} 然后填充所述参数和数据源创建PDF这样后: JasperExportManager.exportReportToPdfFile(jasperPrint,OUTPUTFILENAME + “PDF”); – dosdebug 2013-02-25 12:50:46

+0

您是否尝试使用上述步骤? – dosdebug 2013-02-25 15:30:08