0

我正在使用 my-faces 2.1.5 primefaces 3.2 和 WebLogic Server 版本:10.3.2.0

当我生成文件并尝试通过 p:fileDownload 下载它们时,我收到以下错误消息:

java.lang.IllegalStateException: strict servlet API: cannot call getWriter() after getOutputStream()
at weblogic.servlet.internal.ServletResponseImpl.getWriter(ServletResponseImpl.java:309)
at org.apache.myfaces.context.servlet.ServletExternalContextImpl.getResponseOutputWriter(ServletExternalContextImpl.java:185)
at org.apache.myfaces.renderkit.ErrorPageWriter.handle(ErrorPageWriter.java:469)
at org.apache.myfaces.context.MyFacesExceptionHandlerWrapperImpl.handle(MyFacesExceptionHandlerWrapperImpl.java:301)
at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:64)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:191)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3592)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)

我不知道这是 weblogic 中的错误还是我的代码中的错误?

此消息是我得到的唯一参考,我不知道如何解决此问题

.jsf 文件:

<p:commandButton id="genButton" value="Generate Files" disabled="#{bean.disableButton}" actionListener="#{bean.generate}" onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)" ajax="false" style="width:200px" icon="ui-icon-shuffle">
        <p:fileDownload value="#{bean.zipfile}"/>  
        </p:commandButton> 

豆子:

     File zip = File.createTempFile(selectedCode, "zip");  

            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip.getPath()));  
            for (File file : adapter.listFiles) {  
                addFileToZip(file, zos);  
            }  

            InputStream in = new FileInputStream(zip);  
            file = new DefaultStreamedContent(in, "zip", selectedCode + ".zip");  
            adapter.listFiles.clear();  
            zos.flush();  
            zos.close(); 
4

2 回答 2

2

stacktrace 告诉 MyFaces 异常处理程序试图处理它。

at org.apache.myfaces.context.MyFacesExceptionHandlerWrapperImpl.handle(MyFacesExceptionHandlerWrapperImpl.java:301)
at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:64)

这只会在抛出异常时发生。但是该异常的异常细节又明显地被抑制了,因为 MyFaces 异常处理程序未能处理该异常,因为无法获得响应编写器。

关闭 MyFaces 异常处理程序,您将获得真正的异常详细信息。

于 2012-07-15T03:15:01.710 回答
0

看起来我找到了解决方案:)

如果列表为空,则...

  else {
            if (streamedContent != null) {
                streamedContent.getStream().close();
                streamedContent = null;
            }
        }

谢谢您的帮助。

于 2012-07-15T15:23:09.443 回答