【发布时间】: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