【发布时间】:2011-04-04 09:49:57
【问题描述】:
我正在尝试了解这是如何发生的以及如何解决它。 我有一个 jsf 请求 bean,其 jsp 页面如下所示:(总结)
<f:view locale="#{drcBean.userLocale}">
</f:view>
支持 bean 代码:
public Locale getUserLocale() {
return new Locale("en");
}
最后,当会话开始时,这个方法被调用(向客户端发送一个文件)
private void sendFile()
{
byte[] config = ...;
String clientFileName = "iphone.mobileconfig";
// Prepare.
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
// File file = new File(getFilePath(), getFileName());
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
// Open file.
ByteArrayInputStream bais = new ByteArrayInputStream(config);
input = new BufferedInputStream(bais);
// Init servlet response.
response.reset();
response.setContentType("application/x-apple-aspen-config");
response.setHeader("Content-Disposition", "attachment; filename=\"" + clientFileName
+ "\"");
response.setContentLength((int) config.length);
// if (logger.isTraceEnabled()) {
// logger.trace("Writing XML Script:" + new String(scriptDataByteArray));
// }
output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
// Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Finalize task.
output.flush();
} catch
我得到一个IllegalStateException 异常调用response.getOutputStream()
我不明白的是,如果未定义 locale="#{drcBean.userLocale}",则不会发生这种情况。 (意思是我省略了视图的locale标签,问题就消失了)
另一个证据是,我最终收到的文件是提到的 JSP 页面,在我看来,这意味着以某种方式发送了一个新页面并中止了文件发送。但这与
locale有什么关系?另外,如果我使用
<f:view locale="en">而不是使用支持 bean 作为值,它可以正常工作。
【问题讨论】:
-
IllegalStateException 的消息是什么?
-
java.lang.IllegalStateException at org.apache.myfaces.application.jsp.ViewResponseWrapper.getOutputStream(ViewResponseWrapper.java:115)
-
听起来像 JSF impl bug(但我从未见过这个)。您使用的是哪个 impl 和版本?尝试升级。 Mojarra 1.2 目前是相当成熟的 1.2_15。
-
我的脸 1.2.7。我认为问题源于在语言环境中使用 EL 表达式会导致它向响应中写入一些内容,然后您就无法再发送文件了..
-
通常情况下,如果在调用 getOutputStream() 之前已经向响应发送了一些内容,那么您会收到 IllegalArgumentException,但会显示一条消息“已为此响应调用 getOutputStream”,但是您根本没有收到任何消息?