【问题标题】:Trinidad/ADF Faces, file upload, EOFExceptionTrinidad/ADF Faces、文件上传、EOFException
【发布时间】:2018-09-20 00:28:46
【问题描述】:

我在 Tomcat 8.5 服务器上的 web.xml-version 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]

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

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

  • ADF Faces(至少 12.x)
  • 特立尼达 2.1
  • 一般来说 JSF 2.x
  • 野蝇 (10.1)

【问题讨论】:

    标签: jsf file-upload trinidad eofexception


    【解决方案1】:

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

    使用 JSF 的 &lt;h:inputFile&gt;(自 JSF 2.2 起)而不是 &lt;tr:inputFile&gt;
    您可以继续使用&lt;tr:form usesUpload="true"&gt;,但请参阅下面的说明。
    在支持 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 中的 TrinidadFilter 之前。

    补充说明:

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

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多