Primefaces JSF P:fileUpload не может получить ответ

У меня возникла проблема с <p:fileUpload> PrimeFaces. Я создал страницу Facelet для загрузки файла Excel, как показано ниже:

<p:fileUpload fileUploadListener="#{blackListImportBean.xlsFileUpload}"
    multiple="true" allowTypes="*.xls;*.xlsx" description="*.xls;*.xlsx" 
    sizeLimit="100000"/>
<h:commandButton actionListener="#{blackListImportBean.test}" 
    value="#{msg.SAVE}" action="test-page.xhtml" />

И bean-код Java, как показано ниже:

public void xlsFileUpload(FileUploadEvent event){
    // ...
}

public void test() {
    // ...
}

Когда я нажимаю кнопку, вызывается метод test(), а метод xlsFileUpload() не вызывается, и выдается сообщение об ошибке, что он не может найти метод xlsFileUpload(), потому что методу нужен параметр. Когда я удаляю параметр, страница не может найти метод. Еще одна проблема, которая меня смутила, заключается в том, что я не могу получить файл для загрузки. Я сделал это в соответствии с документацией, и я не знаю, что мне делать.


person smilefatter    schedule 09.11.2011    source источник


Ответы (2)


Два вопроса:

1) Вы используете Primefaces 2.X или 3.X? 2) Что находится в трассировке стека? Вероятно, в нем содержится информация о том, почему.

Компонент загрузки файла загружает файл в свою собственную последовательность событий, поэтому он срабатывает, когда пользователь инициирует загрузку файла. Это может быть сделано автоматически через свойство auto="true". В качестве альтернативы он отображает кнопку «загрузить», которая вызывает загрузку. Таким образом, оно отделено от второго действия, которое является вашим тестовым методом.

Судя по тому факту, что он не может найти ваш метод, я бы предположил, что либо bean-компонент неуправляемый, либо ваши среды не синхронизированы (чистая сборка).

Кроме того, попробуйте простой тест:

@ViewScope
public class TestBean
{
  public void handleFileUpload(FileUploadEvent evt)
  {
     System.out.println("Handling Upload: " + evt.getFile());
     UploadedFile upload = evt.getFile();
FacesContext.getCurrentInstance()
                .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "File Uploaded", "This file is " + upload));
     . . . //do whatever here....
  }
}

//JSF-страница

. . .
     <h:form>
        <p:messages id="messages" />
        <p:fileUpload 
          fileUploadListener="#{testBean.handleFileUpload}"   
          multiple="true" 
          allowTypes="*.*;" 
          update="messages"
        />
      </h:form>

. . .

Если ваш фильтр установлен, вы должны увидеть серию сообщений, отображаемых для каждого загруженного файла. Если нет, вы должны получить полезное сообщение об ошибке. Кроме того, имейте в виду, что вам нужно достаточное количество базовых библиотек Apache (CommonsFileUpload) на пути, и есть вероятность, что это вызывает вашу проблему.

person Daniel B. Chapman    schedule 09.11.2011
comment
я использую Primefaces RC2.2.jar, я копирую образец, который мне дают, и не могу получить результат, который я хочу. - person smilefatter; 10.11.2011
comment
я использую Primefaces RC2.2.jar, я копирую образец, который мне дают, и не могу получить результат, который я хочу, и я очищаю и перестраиваю проект. Боб на самом деле не управляется, и я не знаю причину. - person smilefatter; 10.11.2011
comment
Проблема была решением, ошибка в моем файле web.xml` ‹filter-mapping› ‹filter-name›PrimeFaces FileUpload Filter‹/filter-name› ‹servlet-name›faces-servlet‹/servlet-name› ‹/ filter-mapping›, я не обратил внимания на имя сервлета, потому что он был назван другим, спасибо. - person smilefatter; 10.11.2011
comment
Я рад, что ты понял это. Кроме того, серьезно рассмотрите 3m4 - он довольно стабилен и близок к полной версии. (Компонент загрузки значительно улучшен). - person Daniel B. Chapman; 11.11.2011

Не забудьте добавить это в свой web.xml:

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>
    org.primefaces.webapp.filter.FileUploadFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
person Frédéric Gobert    schedule 09.11.2011
comment
Убедитесь, что имена сервлетов совпадают, потому что, вероятно, причина в этом. - person Frédéric Gobert; 10.11.2011