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

时间:2018-04-10 11:42:19

标签: jsf file-upload trinidad eofexception

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

我得到以下异常并且没有有效的上传文件(即“value”-binded bean属性保持为null):

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上使用Trinidad 1.2.14和web.xml-version 2.5的JSF 1.2版本没有这个问题。)

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

  • ADF Faces(至少12.x)
  • Trinidad 2.1
  • JSF 2.x一般
  • Wildfly(10.1)

1 个答案:

答案 0 :(得分: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(大多数应用已经有一个,我猜)并放入{{1} }}:

doFilter()

当然,您的过滤器必须在 request.setAttribute("org.apache.myfaces.trinidadinternal.config.upload.FileUploadUtils.PROCESSED", Boolean.TRUE); 之前执行,因此要么使用更广泛的过滤器映射,要么将其放在TrinidadFilter中的TrinidadFilter之前。

附加说明:

  • 使用web.xml时,<tr:form>会输出错误的错误/警告“文件上传组件需要一个带有多部分/表格数据的表格的表格”通过FacesMessage - 但 <h:inputFile>制作 您可以在开发中忽略它,或者使用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样式。

另见: