【问题标题】:Jasper on a jsf app in herokuJasper 在 heroku 中的 jsf 应用程序上
【发布时间】: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


【解决方案1】:

错误...

java.lang.IllegalStateException: STREAM at
   org.eclipse.jetty.server.Response.getWriter(Response.java:683) at 

... 表示您对ServletResponse.getWriter() 的访问失败,因为您的应用程序中的其他内容之前已访问过ServletResponse.getOutputStream()。根据 servlet 规范,这是不允许的。您可以使用 Writer 或 OutputStream 作为响应,但不能同时使用两者。请参阅 IllegalStateException 的这两种方法的 javadoc。

【讨论】:

  • 感谢您的回答@Joakim,但它在本地工作有什么意义?
  • 没有详细说明每个请求是如何通过您的容器处理和路由的 + jfaces + heroku + spring + primeface 没有人可以回答这个后续问题。您选择的技术是理智的,但您的问题不包含回答该问题所需的任何细节。
  • 非常感谢@Joakim 的帮助。我刚刚编辑了这个问题,添加了更多信息。但是我仍然不确定我添加的内容是否足够。
  • 看来我添加的信息还不够,所以我正在尝试改变方法(我使用的是ManagedBean,现在我使用的是Servlet)。我遇到了不同的问题,所以我开始为新方法提出一个新问题。谢谢@Joakim,我很确定您的回答没问题,这就是我尝试新方法的原因(我相信它可能与 managedbeans 和 jsf 有关)。我仍然不知道为什么它在本地工作并且仅在部署到 heroku 时失败,这就是为什么我没有将您的答案标记为正确。
  • 您好,我也遇到了同样的问题,请问您找到原因和解决方法了吗?谢谢
猜你喜欢
  • 2014-01-10
  • 2013-08-25
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2022-12-10
  • 2021-12-06
  • 2023-03-24
相关资源
最近更新 更多