【问题标题】:Jasper report on heroku in a jsf appJasper 在 jsf 应用程序中报告 heroku
【发布时间】:2014-01-10 11:39:42
【问题描述】:

我正在使用一个使用 jasperreports 的应用程序。它使用 Primefaces 和 Mojarra,并部署在 Jetty 中。当我在本地部署应用程序时,它确实可以正常工作。但是当我在 heroku 中部署时,它不起作用。

当我将它部署到 heroku 时,我得到:

HTTP 错误 500

访问 /clients.pdf 时出现问题。原因:

Server Error Caused by:

java.lang.NullPointerException 在 java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2310) 在 java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323) 在 java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794) 在 java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 在 java.io.ObjectInputStream.(ObjectInputStream.java:299) 在 net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.(ContextClassLoaderObjectInputStream.java:58) 在 net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:244) 在 net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:229) 在 net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:405) 在 net.sf.jasperreports.engine.JasperRunManager.runToPdfStream(JasperRunManager.java:201) 在 net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:720) 在 co.qcsc.spatha.web.servlet.ReportServlet.generateReport(ReportServlet.java:62) 在 co.qcsc.spatha.web.servlet.ReportServlet.processRequest(ReportServlet.java:37) 在 co.qcsc.spatha.web.servlet.ReportServlet.doGet(ReportServlet.java:25) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:735) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1367) 在 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1338) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) 在 org.eclipse.jetty.server.Server.handle(Server.java:350) 在 org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) 在 org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890) 在 org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944) 在 org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630) 在 org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) 在 org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) 在 java.lang.Thread.run(Thread.java:744)

发送pdf报告的代码是这样的:

public class ReportServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        generateReport(request, response);
    }

    public void generateReport(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Connection connection;
        InputStream reportStream =getServletConfig().getServletContext().getResourceAsStream(
                "/resources/reports/index.jasper");
        ServletOutputStream servletOutputStream = response.getOutputStream();
        try {
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/sid", "sid",
                    "sid");
            response.setContentType("application/pdf");
            JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(),
                    connection);
            connection.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (JRException e) {
            e.printStackTrace();
        }
        servletOutputStream.flush();
        servletOutputStream.close();
    }

在c.xhtml中:

...
    <h:form id="reportForm">
        <p:commandButton value="Generate Report" id="generate_report"
                oncomplete="reportDialogWidget.show()"/>
    </h:form>
    <p:dialog id="reportDialog" modal="true" widgetVar="reportDialogWidget" dynamic="true" resizable="true" maximizable="true" showEffect="fade" hideEffect="explode">
        <iframe src="/clients.pdf" width="800" height="600"></iframe>
    </p:dialog>
...

web.xml 中与这个 servlet 相关的部分:

  <servlet>
    <servlet-name>ReportServlet</servlet-name>
    <servlet-class>com.jg.servlet.ReportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReportServlet</servlet-name>
    <url-pattern>/clients.pdf</url-pattern>
  </servlet-mapping>

我一直在寻找,但没有找到任何对我有帮助的东西。我认为这些信息足以获得一些帮助,但如果我遗漏了什么,请告诉我,我会添加任何需要的内容。

提前感谢您阅读我的问题。

【问题讨论】:

  • @AlexK 这不是重复的。如果您阅读它,那是我用两种不同的方法要求两个不同的错误。

标签: java servlets heroku jasper-reports


【解决方案1】:

这一行的东西:

InputStream reportStream =getServletConfig().getServletContext().getResourceAsStream(
            "/resources/reports/index.jasper");

当您将资源作为流获取时,您必须确保该资源存在。 Heroku 可能找不到它。检查它是否也被提交,或者在使用它之前最好还是检查reportStream上的空指针异常。

【讨论】:

  • 谢谢@unekwu 我已经检查过了。资源已提交。是的,我可以检查 NullPointerException ......但我仍然无法显示包含所需数据的 pdf。还有其他想法吗?
  • 我真是太愚蠢了!谢谢@unekwu,我正在检查 index.jrxml ......不是 index.jasper
  • 好吧,我们都犯过类似的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多