特立尼达/ADF 面孔,文件上传,EOFException



我在Tomcat 8.5服务器上的web.xml版本3.1中使用JSF 2.3(Mojarra 2.3.3),Trinidad(2.2.1)及其文件上传组件(tr:inputFile)。

我收到以下异常并且没有有效的上传文件(即"值"绑定的 bean 属性保持空):

java.io.EOFException: null
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._readLine(MultipartFormHandler.java:253) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._readLine(MultipartFormHandler.java:237) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler._skipBoundary(MultipartFormHandler.java:223) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.<init>(MultipartFormHandler.java:102) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.<init>(MultipartFormHandler.java:75) ~[trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.upload.FileUploadConfiguratorImpl.beginRequest(FileUploadConfiguratorImpl.java:139) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl._startConfiguratorServiceRequest(GlobalConfiguratorImpl.java:763) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl.beginRequest(GlobalConfiguratorImpl.java:244) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:178) [trinidad-impl-2.2.1.jar:2.2.1]
at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92) [trinidad-api-2.2.1.jar:2.2.1]

(信息:带有特立尼达 1.2.14 和 web.xml-version 2.5 的 JSF 1.2 版本在 Tomcat 6 或 Weblogic 10 上没有这个问题。

在寻找解决方案时,我发现这似乎不仅影响了我的具体情况,还影响了:

  • ADF 面(至少 12.x)
  • 特立尼达 2.1
  • JSF 2.x 概述
  • 野蝇 (10.1)

为了寻找答案,我开发了一个想要分享的解决方案。

使用 JSF的<h:inputFile>(从 JSF 2.2 开始)而不是<tr:inputFile>
您可以继续使用<tr:form usesUpload="true">,但请参阅下面的注释。
在支持bean中,您必须简单地将org.apache.myfaces.trinidad.model.UploadedFile替换为javax.servlet.http.Part并使用getSubmittedFileName()而不是getFileName()

这样,文件上传已经可以工作,但EOFException仍然会发生并被记录(但在内部被忽略)。
为了防止所需的TrinidadFilter(在web.xml中配置)处理文件上传,请添加您自己的javax.servlet.Filter(我猜大多数应用程序已经有一个)并放入其doFilter()

request.setAttribute("org.apache.myfaces.trinidadinternal.config.upload.FileUploadUtils.PROCESSED", Boolean.TRUE);

当然,您的过滤器必须在TrinidadFilter之前执行,因此要么使用更广泛的过滤器映射,要么将其放在web.xml中的特立尼达过滤器之前。

附加说明:

  • 使用<tr:form>时,<h:inputFile>将通过FacesMessage输出错误的错误/警告"文件上传组件需要具有多部分/表单数据格式的表单">- 但不适用于javax.faces.PROJECT_STAGE生产。
    您可以在开发中简单地忽略它或改用<h:form enctype="multipart/form-data">。但请注意:<h:form>是一个命名容器,而<tr:form>不是,因此寻址输入元素不同(hformId:inputId而不是简单的inputId
  • 如果您的<tr:inputFile><tr:panelFormLayout>内使用,请将<h:inputFile>放在<tr:panelLabelAndMessage>内并将标签放在那里。
  • af|inputFile::content的 CSS 样式也必须为input[type="file"]完成。

另请参阅:

  • https://stackoverflow.com/a/27681292/5074004
  • https://developer.jboss.org/thread/274824?_sscc=t
  • http://myfaces.10567.n7.nabble.com/Trinidad-File-upload-issue-td30231.html

相关内容

  • 没有找到相关文章

最新更新