Trinidad/ADF 人脸,文件上传,EOFException
Trinidad/ADF Faces, file upload, EOFException
我在 Tomcat 8.5 上的 web.xml-3.1 版中使用 JSF 2.3 (Mojarra 2.3.3)、Trinidad (2.2.1) 及其文件上传组件 (tr:inputFile)服务器。
我得到以下异常并且没有有效的上传文件(即 "value"-binded 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 上带有 web.xml-version 2.5 的 JSF 1.2 版本与 Trinidad 1.2.14 或 Weblogic 10 没有此问题。)
在寻找解决方案时,我发现这似乎不仅影响我的具体情况,而且:
- ADF Faces(至少 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
之前执行,因此要么使用更广泛的 filter-mapping,要么将其放在 [=] 中的 TrinidadFilter 之前20=].
补充说明:
- 当使用
<tr:form>
时,<h:inputFile>
将通过 FacesMessage 输出错误的 error/warning "File upload component requires a form with an enctype of multipart/form-data" - 但 不 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>
中,然后将标签放在那里。
- CSS
af|inputFile::content
的样式也必须为 input[type="file"]
完成。
另请参阅:
我在 Tomcat 8.5 上的 web.xml-3.1 版中使用 JSF 2.3 (Mojarra 2.3.3)、Trinidad (2.2.1) 及其文件上传组件 (tr:inputFile)服务器。
我得到以下异常并且没有有效的上传文件(即 "value"-binded 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 上带有 web.xml-version 2.5 的 JSF 1.2 版本与 Trinidad 1.2.14 或 Weblogic 10 没有此问题。)
在寻找解决方案时,我发现这似乎不仅影响我的具体情况,而且:
- ADF Faces(至少 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
之前执行,因此要么使用更广泛的 filter-mapping,要么将其放在 [=] 中的 TrinidadFilter 之前20=].
补充说明:
- 当使用
<tr:form>
时,<h:inputFile>
将通过 FacesMessage 输出错误的 error/warning "File upload component requires a form with an enctype of multipart/form-data" - 但 不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>
中,然后将标签放在那里。 - CSS
af|inputFile::content
的样式也必须为input[type="file"]
完成。
另请参阅: