Тринидад /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"],

Смотрите также:

Другие вопросы по тегам