使用JSF生成PDF Jasper报告返回java.lang.NullPointerException错误

使用JSF生成PDF Jasper报告返回java.lang.NullPointerException错误,jsf,jasper-reports,Jsf,Jasper Reports,我是贾斯佩雷波特的新人。我正在使用Eclipse Luna和JasperSoft Studio。jasperreports-3.7.6.jar。我正在尝试从JSF页面生成一个pdf文件,这就是我得到的: java.lang.NullPointerException 例外情况 javax.servlet.ServletException 根本原因 java.lang.NullPointerException 这是JSF页面 <h:body> <h:form>

我是贾斯佩雷波特的新人。我正在使用Eclipse Luna和JasperSoft Studio。jasperreports-3.7.6.jar。我正在尝试从JSF页面生成一个pdf文件,这就是我得到的:

java.lang.NullPointerException

例外情况

javax.servlet.ServletException

根本原因

java.lang.NullPointerException

这是JSF页面

<h:body> 
    <h:form>
        <h:inputText value="#{gradeManagedBean.code}" />
        <h:inputText value="#{gradeManagedBean.name}" />
        <h:commandButton actionListener ="#{gradeManagedBean.save}" value="submit"/>
    </h:form>
</h:body>

JSF ManagedBean:

package managedBean;

    import java.io.File;
    import java.io.IOException;
    import java.io.Serializable;
    import java.util.HashMap;
    import java.util.Map;

    import javax.ejb.EJB;
    import javax.enterprise.context.SessionScoped;
    import javax.faces.bean.ManagedBean;
    import javax.faces.context.FacesContext;
    import javax.faces.event.ActionEvent;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;

    import net.sf.jasperreports.engine.JREmptyDataSource;
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JasperExportManager;
    import net.sf.jasperreports.engine.JasperFillManager;
    import net.sf.jasperreports.engine.JasperPrint;
    import ejb.Service;
    import ejb.ServiceLocal;
    import entity.Grade;

    @ManagedBean
    @SessionScoped
    public class GradeManagedBean implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@EJB
private ServiceLocal service;

private int code;
private String name;
private Grade grade = new Grade();

public GradeManagedBean(){

}
public Grade getGrade() {
    return grade;
}
public void setGrade(Grade grade) {
    this.grade = grade;
}
public ServiceLocal getService() {
    return service;
}
public void setService(Service service) {
    this.service = service;
}
public int getCode() {
    return code;
}
public void setCode(int code) {
    this.code = code;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

public void save(ActionEvent actionEvent) throws JRException, IOException{
    grade.setCode(code);
    grade.setName(name);
    service.saveGrade(grade);

    String codeString = ""+ grade.getCode() ;
    Map<String, Object> hm = new HashMap<String, Object>();
    hm.put("CODE",codeString);
    hm.put("NAME",grade.getName());
    System.out.println("Test 1");
    String fileName = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/Report3.jasper");
    System.out.println("Test 2");
    File jasper = new File(fileName);
    JasperPrint print = JasperFillManager.fillReport(jasper.getPath(),hm, new JREmptyDataSource());
    System.out.println("Test 3");
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    System.out.println("Test 4");
    response.addHeader("Content-disposition", "attachment; filename=Report2.pdf");
    System.out.println("Test 5");
    ServletOutputStream stream = response.getOutputStream();
    System.out.println("Test 6");
    JasperExportManager.exportReportToPdfStream(print, stream);
    System.out.println("Test 7");
    stream.flush();
    stream.close();
    System.out.println("Test 8");
    FacesContext.getCurrentInstance().responseComplete();
    System.out.println("Test 9");

}

    }
包管理bean;
导入java.io.File;
导入java.io.IOException;
导入java.io.Serializable;
导入java.util.HashMap;
导入java.util.Map;
导入javax.ejb.ejb;
导入javax.enterprise.context.SessionScoped;
导入javax.faces.bean.ManagedBean;
导入javax.faces.context.FacesContext;
导入javax.faces.event.ActionEvent;
导入javax.servlet.ServletOutputStream;
导入javax.servlet.http.HttpServletResponse;
导入net.sf.jasperreports.engine.JREmptyDataSource;
导入net.sf.jasperreports.engine.JRException;
导入net.sf.jasperreports.engine.jaspeexportmanager;
导入net.sf.jasperreports.engine.JasperFillManager;
导入net.sf.jasperreports.engine.JasperPrint;
导入ejb.Service;
导入ejb.ServiceLocal;
进口实体。等级;
@ManagedBean
@会议范围
公共类GradeManagedBean实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
@EJB
私人服务本地服务;
私有整数码;
私有字符串名称;
私人等级=新等级();
公共级ManagedBean(){
}
公开职系{
返回等级;
}
公众休憩用地等级(等级){
这个。等级=等级;
}
公共服务本地getService(){
回程服务;
}
公共无效设置服务(服务服务){
服务=服务;
}
公共int getCode(){
返回码;
}
公共无效设置码(整数码){
this.code=代码;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
public void save(ActionEvent ActionEvent)引发JRException、IOException{
等级。设置代码(代码);
等级。设置名称(名称);
服务等级(等级);
String codeString=”“+grade.getCode();
Map hm=新的HashMap();
hm.put(“代码”,代码字符串);
hm.put(“NAME”,grade.getName());
系统输出打印项次(“测试1”);
字符串文件名=FacesContext.getCurrentInstance().getExternalContext().getRealPath(“/Report3.jasper”);
系统输出打印项次(“测试2”);
文件jasper=新文件(文件名);
JasperPrint print=JasperFillManager.fillReport(jasper.getPath(),hm,新的jrpemptyDataSource());
系统输出打印项次(“测试3”);
HttpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
系统输出打印项次(“测试4”);
addHeader(“内容处置”、“附件;文件名=Report2.pdf”);
系统输出打印项次(“测试5”);
ServletOutputStream=response.getOutputStream();
系统输出打印项次(“测试6”);
JasperExportManager.exportReportToPdfStream(打印,流);
系统输出打印项次(“测试7”);
stream.flush();
stream.close();
系统输出打印项次(“测试8”);
FacesContext.getCurrentInstance().responseComplete();
系统输出打印项次(“测试9”);
}
}

非常感谢您的帮助

我通过添加itext-pdfa-5.5.5 jar解决了这个问题

从*.jasper文件生成pdf文件需要这个jar


我还将jasperreports jar更新为最新版本。

那些
sout
语句跟踪什么(如何遍历
save()
方法)?我认为生成Jasper报告不需要一个详细的会话作用域管理。到底什么是计算为null?sout语句只是为了验证它所导致的问题。单击commandButton时调用它。缺少itextPdfa jar。我添加了它,它现在正在工作。