首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特立尼达/ADF Faces,文件上传,EOFException

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

Stack Overflow用户
提问于 2018-04-10 11:42:18
回答 1查看 1.3K关注 0票数 2

我在Tomcat 8.5服务器上使用了JSF 2.3 (Mojarra 2.3.3)、特立尼达(2.2.1)及其文件上传组件(tr:inputFile)。

我得到以下异常,并且没有有效的上载文件(即"value"-binded bean属性仍然为空):

代码语言:javascript
复制
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上使用带有web.xml的特立尼达1.2.14版本的JSF1.2版本2.5没有这个问题。)

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

  • ADF面(至少12.x)
  • 特立尼达2.1
  • JSF2.x
  • 野蝇(10.1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 11:42:18

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

使用JSF的<h:inputFile> (从JSF2.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()

代码语言:javascript
复制
request.setAttribute("org.apache.myfaces.trinidadinternal.config.upload.FileUploadUtils.PROCESSED", Boolean.TRUE);

当然,您的过滤器必须在TrinidadFilter之前执行,所以要么使用更广泛的过滤器-映射,要么把它放在web.xml中的TrinidadFilter之前。

补充说明:

  • 当使用<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"]完成。

另请参阅:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49752729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档