Primefaces ‹p:fileUpload не вызывает метод компонента

Я пытаюсь реализовать загрузку файла Primefaces, но не вызываю метод bean, кстати, я использую Spring Framework и Beautifulfaces:

faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app
<h:form enctype="multipart/form-data" prependId="false">
                            <p:fileUpload mode="simple" value="#{templateController.file}" />
                            <p:commandButton value="Upload" actionListener="#{templateController.upload}" ajax="false" />
                        </h:form>
0.xsd" version="3.0"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application-context.xml</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <context-param> <param-name>log4j-config-location</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>co.com.core.commons.LogContextListener</listener-class> </listener> <!-- ############################################# --> <!-- # File upload # --> <!-- ############################################# --> <filter> <filter-name>PrimeFaces FileUpload Filter</filter-name> <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> <init-param> <param-name>thresholdSize</param-name> <param-value>2097152</param-value> </init-param> </filter> <filter-mapping> <filter-name>PrimeFaces FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!-- ############################################# --> <!-- # QUARTZ # --> <!-- ############################################# --> <!-- listener> <listener-class> org.quartz.ee.servlet.QuartzInitializerListener </listener-class> </listener--> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> </web-app>
2.xsd"> <application> <resource-bundle> <base-name>label</base-name> <var>msg</var> </resource-bundle> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> </application> </faces-config>

файл web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app
<h:form enctype="multipart/form-data" prependId="false">
                            <p:fileUpload mode="simple" value="#{templateController.file}" />
                            <p:commandButton value="Upload" actionListener="#{templateController.upload}" ajax="false" />
                        </h:form>
0.xsd" version="3.0"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application-context.xml</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <context-param> <param-name>log4j-config-location</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>co.com.core.commons.LogContextListener</listener-class> </listener> <!-- ############################################# --> <!-- # File upload # --> <!-- ############################################# --> <filter> <filter-name>PrimeFaces FileUpload Filter</filter-name> <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> <init-param> <param-name>thresholdSize</param-name> <param-value>2097152</param-value> </init-param> </filter> <filter-mapping> <filter-name>PrimeFaces FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!-- ############################################# --> <!-- # QUARTZ # --> <!-- ############################################# --> <!-- listener> <listener-class> org.quartz.ee.servlet.QuartzInitializerListener </listener-class> </listener--> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> </web-app>

Код .xhtml:

<h:form enctype="multipart/form-data" prependId="false">
                            <p:fileUpload mode="simple" value="#{templateController.file}" />
                            <p:commandButton value="Upload" actionListener="#{templateController.upload}" ajax="false" />
                        </h:form>

метод компонента:

public void upload() {  
    FacesMessage msg = new FacesMessage("Success! is uploaded.");  
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

Я попытался добавить FORWARD к фильтру, потому что я также использую красивые лица, но все равно не работает, спасибо.


person Diego Nieto    schedule 01.03.2016    source источник
comment
Какова область действия управляемого компонента?   -  person SAP    schedule 02.03.2016
comment
у него есть область сеанса   -  person Diego Nieto    schedule 02.03.2016


Ответы (3)


Попробуйте реализовать следующее,

добавьте этот метод в свой компонент,

    public void handleProfileFileUpload(FileUploadEvent event) {
    if (event != null) {


        try {
            InputStream inputStream = event.getFile().getInputstream();
            // Set inputstream to your object
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Удалите CommandButton и измените конфигурацию fileUpload, аналогичную этой, fileUploadListener обрабатывает загрузку

<p:fileUpload fileUploadListener="#{<your bean>.handleProfileFileUpload}"
                            mode="advanced" sizeLimit="2097152"
                            allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />
person SAP    schedule 01.03.2016
comment
Что вы видите в отладке для объекта события в методе handleProfileFileUpload? - person SAP; 03.03.2016
comment
Ну, на самом деле не так уж много, ни в консоли веб-браузера, ни ошибок js нет. - person Diego Nieto; 03.03.2016
comment
Ну надо отлаживать и смотреть, иначе никакой зацепки не найдёшь - person SAP; 04.03.2016
comment
это то, что я сделал, мой друг, но я не получаю никаких ошибок, не знаю, что еще я могу сделать. - person Diego Nieto; 04.03.2016

Ну, наконец, после большого количества чтений я решил это, в моем случае решение заключалось в том, чтобы добавить параметр контекста (primefaces.UPLOADER) в файл web.xml (проверьте этот ответ, пожалуйста), этот файл выглядит так, также может быть полезно установить стадию проекта для разработки (комментарии в этом файле), это может дать вам дополнительную информацию, связанную с отладкой процесс:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- context-param>
            <param-name>javax.faces.PROJECT_STAGE</param-name>
            <param-value>Development</param-value>
    </context-param-->

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/application-context.xml</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

    <context-param>
        <param-name>log4j-config-location</param-name>
        <param-value>WEB-INF/log4j.properties</param-value>
    </context-param>
    <listener>
        <listener-class>co.com.core.commons.LogContextListener</listener-class>
    </listener>
    <!-- ############################################# -->
    <!-- # File upload                                      # -->
    <!-- ############################################# -->
    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        <init-param>
            <param-name>thresholdSize</param-name>
            <param-value>2097152</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

    <context-param>
        <param-name>primefaces.UPLOADER</param-name>
        <param-value>commons</param-value>
    </context-param>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>
person Diego Nieto    schedule 04.03.2016

Если вы используете Spring MVC, ваше сопоставление фильтров должно указывать на Spring DispatcherServlet вместо Faces Servet.

<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>Spring MVC Servlet</servlet-name>
</filter-mapping>
person Federico Traiman    schedule 11.08.2016
comment
Вы имеете в виду Spring MVC? ОП этим не пользуется. Afaik, одновременное использование JSF и MVC - плохой выбор (если вообще работает, см. spring-mvc" title="использование jsf в качестве технологии просмотра Spring MVC">stackoverflow.com/questions/18744910/) - person Kukeltje; 11.08.2016
comment
Я без проблем использую Spring MVC/Webflow вместе с Primefaces и JPA. Я не считаю, что это плохой выбор. Что вы имеете в виду, когда говорите, что OP не использует это? - person Federico Traiman; 11.08.2016
comment
Вы используете Spring MVC или Spring Webflow? Две разные технологии, если я внимательно прочитал ссылку, которую я разместил. Вы можете использовать Spring Webflow с JSF, но не Spring MVC (хотя вы можете запускать их рядом, если я правильно понял). Поэтому, если вы на самом деле делаете больше, мне было бы очень интересно, есть ли общедоступный код, чтобы увидеть, как он на самом деле используется, и, возможно, исправить ссылку, которую я разместил. - person Kukeltje; 11.08.2016