【发布时间】:2013-12-20 15:13:56
【问题描述】:
我正在使用一个使用 jasperreports 的应用程序。它使用 Primefaces 和 Mojarra,并部署在 Jetty 中。当我在本地部署应用程序时,它确实可以正常工作。但是当我在 heroku 中部署时,它不起作用。
当我将它部署到 heroku 时,我得到:
HTTP 错误 500
Problem accessing /pages/client.jsf. Reason:
STREAM Caused by:
java.lang.IllegalStateException: STREAM at
org.eclipse.jetty.server.Response.getWriter(Response.java:683) at
com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
at
com.sun.faces.application.view.FaceletViewHandlingStrategy.createResponseWriter(FaceletViewHandlingStrategy.java:930)
at
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:376)
at
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1367)
at
org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1338)
at
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1338)
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:484)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
at
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:350) at
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
at
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:900)
at
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:954)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851)
at
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
at java.lang.Thread.run(Thread.java:744)
如您所见,它是使用 Jetty 部署的。
发送pdf报告的代码是这样的:
@ManagedBean(name="reportGeneratorMB")
@RequestScoped
public class ReportGeneratorMB {
public void generateReport(ActionEvent actionEvent) throws ClassNotFoundException,
SQLException, IOException, JRException {
Connection connection;
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext()
.getResponse();
InputStream reportStream = facesContext.getExternalContext().getResourceAsStream(
"/resources/reports/index.jasper");
ServletOutputStream servletOutputStream = response.getOutputStream();
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/sid", "sid",
"sid");
facesContext.getExternalContext().setResponseContentType("application/pdf");
response.setContentType("application/pdf");
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(),
connection);
connection.close();
servletOutputStream.flush();
servletOutputStream.close();
facesContext.responseComplete();
}
}
在c.xhtml中:
...
<h:form id="reportForm">
<p:commandButton value="Generate Report" id="generate_report"
actionListener="#{reportGeneratorMB.generateReport} ajax="false"/>
</form>
...
我已经搜索过,但仍然没有找到可以帮助我的东西,而且由于它在本地工作,我不知道我能做什么。我不确定这些数据是否足够,但如果不够,请告诉我需要提供哪些信息才能获得帮助,我将不胜感激。
提前致谢,
胡安
【问题讨论】:
-
粘贴的堆栈跟踪中没有提到
generateReport()。
标签: jsf heroku jasper-reports jetty