Тринидад /ADF Faces, загрузка файлов, EOFException
Я использую JSF 2.3 (Mojarra 2.3.3), Trinidad (2.2.1) и его компонент загрузки файлов (tr:inputFile) в web.xml-версии 3.1 на сервере Tomcat 8.5.
Я получаю следующее исключение, и нет действительного загруженного файла (т. Е. Атрибут 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]
(Информация: версия JSF 1.2 с Trinidad 1.2.14 с web.xml-версией 2.5 на Tomcat 6 или Weblogic 10 не имеет этой проблемы.)
При поиске решения я обнаружил, что это влияет не только на мою конкретную ситуацию, но и на:
- Лица АПД (минимум 12.x)
- Тринидад 2.1
- JSF 2.x в целом
- Wildfly (10.1)
1 ответ
В поисках ответа я разработал решение, которым хочу поделиться.
Используйте JSF <h:inputFile>
(начиная с JSF 2.2) вместо <tr:inputFile>
,
Вы можете продолжать использовать <tr:form usesUpload="true">
, но смотри заметки ниже.
В бобе вы должны просто заменить 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
так что либо используйте более широкое сопоставление фильтров или поместите его перед 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>
и поместите этикетку там. - CSS-стиль для
af|inputFile::content
также должно быть сделано дляinput[type="file"]
,
Смотрите также: