Jasper在heroku上的一个jsf应用程序 [英] Jasper on a jsf app in heroku

查看:140
本文介绍了Jasper在heroku上的一个jsf应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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


HTTP ERROR 500




 访问/pages/client.jsf时出现问题。原因:




  STREAM由:




  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。 Lifecycl eImpl.render(LifecycleImpl.java:139)
位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder。
at
org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1367)
at
org.primefaces.webapp.filter。 FileUploadFilter.doFilter(FileUploadFilter.java:79)
。在
。在
组织org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1338)
。在

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at

org.eclipse.jetty.servlet.ServletHandler.doHandle org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1338)
(Servle
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)
。在
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)

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)
a吨
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
。在
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper。
at org.eclipse.jetty.server.Server.handle(Server.java:350)at
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)在
org.eclipse.jetty.server.AbstractHttpConnection.content
(AbstractHttpConnection.java:900)
。在
$ org.eclipse.jetty.server.AbstractHttpConnection RequestHandler.content( AbstractHttpConnection.java:954)在org.eclipse.jetty.http.HttpParser.parseNext
(HttpParser.java:851)
。在
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(选择ChannelEndPoint.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 {
连接连接;
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中:

  ... 
< p:commandButton value =Generate Reportid =generate_report
actionListener =#{reportGeneratorMB.generateReport} ajax =false/>
< / form>
...

我搜索过的东西还没有找到可以帮助我,因为它在本地工作,所以我不知道我能做什么。我不确定这些数据是否足够,但如果不是,我会很感激你告诉我需要提供哪些信息以获得一些帮助。



在此先感谢,



Juan G
<解决方案

错误...

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

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


I am working in an application that uses jasperreports. It uses Primefaces with Mojarra, and is deployed in Jetty. When I deploy the app locally, it does work ok. But when I deploy in heroku it is not working.

When I deploy it to heroku I obtain:

HTTP ERROR 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)

As you can see it is deployed using Jetty.

The code that sends the pdf report is this:

@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();
    }
}

And in the c.xhtml:

...
<h:form id="reportForm">
    <p:commandButton value="Generate Report" id="generate_report"
            actionListener="#{reportGeneratorMB.generateReport} ajax="false"/>
</form>
...

I've searched by I still haven't found a thing that can help me, and since it is working locally I do not know what can I do. I am not sure if this data is enough, but if it isn't I'll be grateful if you tell me what information I need to provide to get some help.

Thanks in advance,

Juan G

解决方案

The error ...

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

... means that your access to ServletResponse.getWriter() failed because something else in your application has previously accessed ServletResponse.getOutputStream(). That is not allowed per the servlet spec. You can either use a Writer or an OutputStream for your response, but not both. See javadoc on both of those methods for IllegalStateException.

这篇关于Jasper在heroku上的一个jsf应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆