【问题标题】:How to get jasperreport file (.JRXML) exact location to load to the system?如何获取 jasperreport 文件 (.JRXML) 的确切位置以加载到系统?
【发布时间】:2016-11-01 23:07:01
【问题描述】:

我试图加载我创建的 jasper 报告 (.jrxml),我将报告命名为“JREmp1.xml”。但我得到了这个错误

"HTTP 状态 500 - 请求处理失败;嵌套异常是 net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: D:\printpdf.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\JasperExample\jasper\JREmp1.jrxml (系统找不到指定的路径)”

如何获得确切的位置?这是我的 JREmp1.xml 文件位置:

这是我的控制器类中的代码:

@RequestMapping(value = "/generateReport", method = RequestMethod.POST)
public String generateReport(
        @Valid @ModelAttribute("jasperInputForm") JasperInputForm jasperInputForm,
        BindingResult result, Model model, HttpServletRequest request,
        HttpServletResponse response) throws JRException, IOException,
        NamingException {

    if (result.hasErrors()) {
        System.out.println("validation error occured in jasper input form");
        return "loadJasper";

    }

    String reportFileName = "JREmp1";
    JasperReportDAO jrdao = new JasperReportDAO();

    Connection conn = null;

    try {
        conn = jrdao.getConnection();

        String rptFormat = jasperInputForm.getRptFmt();
        String noy = jasperInputForm.getNoofYears();

        System.out.println("rpt format " + rptFormat);
        System.out.println("no of years " + noy);

        HashMap<String, Object> hmParams = new HashMap<String, Object>();

        hmParams.put("noy", new Integer(noy));

        hmParams.put("Title", "Employees working more than " + noy
                + " Years");

        JasperReport jasperReport = jrdao.getCompiledFile(reportFileName,
                request);

        if (rptFormat.equalsIgnoreCase("html")) {
            JasperPrint jasperPrint = JasperFillManager.fillReport(
                    jasperReport, hmParams, conn);
            jrdao.generateReportHtml(jasperPrint, request, response); // For
            // HTML
            // report
        }
        else if (rptFormat.equalsIgnoreCase("pdf")) {
            jrdao.generateReportPDF(response, hmParams, jasperReport, conn); // For
            // PDF
            // report
        }
    } catch (SQLException sqlExp) {
        System.out.println("Exception::" + sqlExp.toString());
    } finally {
        if (conn != null) {
            try {
                conn.close();
                conn = null;
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return null;
}

这是我的JasperReportDAO 类中的代码:

public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException {
    System.out.println("path " + request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
    File reportFile = new File( request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
    // If compiled file is not found, then compile XML template
    if (!reportFile.exists()) {
        JasperCompileManager.compileReportToFile(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jrxml"),request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
    }
    JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath());
    return jasperReport;
}


public void generateReportHtml( JasperPrint jasperPrint, HttpServletRequest req, HttpServletResponse resp) throws IOException, JRException {
    HtmlExporter exporter=new HtmlExporter();
    List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
    jasperPrintList.add(jasperPrint);
    exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
    exporter.setExporterOutput( new SimpleHtmlExporterOutput(resp.getWriter()));
    SimpleHtmlReportConfiguration configuration =new SimpleHtmlReportConfiguration();
    exporter.setConfiguration(configuration);
    exporter.exportReport();

}


public void generateReportPDF (HttpServletResponse resp, Map parameters, JasperReport jasperReport, Connection conn)throws JRException, NamingException, SQLException, IOException {
    byte[] bytes = null;
    bytes = JasperRunManager.runReportToPdf(jasperReport,parameters,conn);
    resp.reset();
    resp.resetBuffer();
    resp.setContentType("application/pdf");
    resp.setContentLength(bytes.length);
    ServletOutputStream ouputStream = resp.getOutputStream();
    ouputStream.write(bytes, 0, bytes.length);
    ouputStream.flush();
    ouputStream.close();
}

这是我的JasperInputForm 课程:

public class JasperInputForm {

    @NotEmpty
    private String noofYears;
    private String rptFmt="Html";

    public String getRptFmt() {
        return rptFmt;
    }

    public void setRptFmt(String rptFmt) {
        this.rptFmt = rptFmt;
    }

    public String getNoofYears() {
        return noofYears;
    }

    public void setNoofYears(String noofYears) {
        this.noofYears = noofYears;
    }

}

如何正确获取我的JREmp1.jrxml 文件位置?我为 Spring MVC 应用程序开发此报告

更新: 这是我用@Wilson 回答更新后的完整功能代码(我选择@Wilson 所说的第二个选项): 这个函数在 JasperReportDAO 里面:

public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException, MalformedURLException, URISyntaxException {
    System.out.println("path " + request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
    //File reportFile = new File( request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
    URL resourceUrl = request.getSession().getServletContext().getResource("/WEB-INF/jasper/" + fileName + ".jrxml");
    File reportFile = new File(resourceUrl.toURI());

    // If compiled file is not found, then compile XML template
    if (!reportFile.exists()) {
               JasperCompileManager.compileReportToFile(request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jrxml"),request.getSession().getServletContext().getRealPath("/jasper/" + fileName + ".jasper"));
        }
        JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath());
       return jasperReport;
}

我得到了这个错误

"HTTP 状态 500 - 请求处理失败;嵌套异常是 java.lang.IllegalArgumentException:URI 方案不是“文件””

如何解决?

【问题讨论】:

    标签: java spring-mvc jasper-reports pdf-generation


    【解决方案1】:

    如果 jrxml 存在于Resource 文件夹中,我们可以使用下面的代码 sn-p -

    InputStream employeeReportStream = getClass().getResourceAsStream("/report.jrxml");
    JasperReport report = JasperCompileManager.compileReport(employeeReportStream);
    

    【讨论】:

      【解决方案2】:

      使用ServeltContext 读取文件有多种方法:

      1。 使用ServletContext#getRealPath

      String fullPath = request.getSession().getServletContext().getRealPath("/WEB-INF/jasper/" + fileName + ".jrxml");
      

      这将为您提供您正在寻找的资源的完整系统路径。但是,如果容器不展开 WAR 文件,它将不起作用。

      2。 使用ServletContext#getResource

      URL resourceUrl = request.getSession().getServletContext().getResource("/WEB-INF/jasper/" + fileName + ".jrxml");
      File file = new File(resourceUrl.toURI());
      

      无论您使用什么容器以及应用程序安装在哪里,这都会返回 URL。

      3。 用户ServletContext#getResourceAsStream

      InputStream resourceStream = request.getSession().getServletContext().getResourceAsStream("/WEB-INF/jasper/" + fileName + ".jrxml");
      

      这是ServletContext#getResource 的替代方法来获得inputSteam

      更新

      ServletContext#getResource 返回的 URL 可能不是文件 URL,可能会导致问题。请尝试ServletContext#getResourceAsStreamJasperCompileManager#compileReportToFile

      JasperDesign jasperDesign = JRXmlLoader.load(resourceStream);
      JasperCompileManager.compileReportToFile(jasperDesign, jasperFilePath);
      

      我发现您正在尝试将 jasper 报告文件写入您的程序分发中,这应该避免。首选方法是预编译您的报告并放入您的 WAR 文件或将编译后的 jasper 报告放入临时目录。

      以下是完整的代码示例:

      public JasperReport getCompiledFile(String fileName, HttpServletRequest request) throws JRException, IOException {
          // Create temporary folder to store jasper report as you should not write a resource into your program
          // distribution
          String tempFolderPath = System.getProperty("java.io.tmpdir") + File.separator + "jasperReport";
          File tempFolder = new File(tempFolderPath);
          if (!tempFolder.exists()) {
              tempFolder.mkdirs();
          }
          String jasperFilePath = tempFolderPath + File.separator + fileName + ".jasper";
          File reportFile = new File(jasperFilePath);
          // If compiled file is not found, then compile XML template
          if (!reportFile.exists()) {
              InputStream jRXmlStream = request.getSession().getServletContext().getResourceAsStream
                      ("/WEB-INF/jasper/" + fileName + ".jrxml");
              JasperDesign jasperDesign = JRXmlLoader.load(jRXmlStream);
              JasperCompileManager.compileReportToFile(jasperDesign, jasperFilePath);
          }
          JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(reportFile.getPath());
          return jasperReport;
      }
      

      【讨论】:

      • 我将尝试第二个选项,即使用 servletcontext。如何声明 context.getResource?我认为上下文是一些变量对吗?
      • 是的,contextrequest.getSession().getServletContext()。让我更新一下。
      • 好的,所以我添加了代码,它给了我这样的语法错误,我必须抛出 MalformedURLException,URISyntaxException,所以我在我的函数中添加了这个抛出,然后当我运行我的代码时错误就消失了,它说"java.lang.IllegalArgumentException: URI scheme is not "file" "怎么解决?
      • 我调试了resourceURL变量,内容看起来像这样“jndi:/localhost/jasper/WEB-INF/jasper/JREmp1.jrxml”
      • 很抱歉,我忘记了 URL 可能不是文件 URL。请尝试ServletContext#getResourceStreamJasperCompileManager#compileReport
      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多