2013-10-04 7 views
6

Ich kann die fileUpload-Komponente nicht auf PrimeFaces 3.5 erstellen, um das Ereignis auszulösen. Ich habe viele Beiträge zu diesem Thema gelesen und befolgte Ratschläge, aber es funktioniert trotzdem nicht. Ich habe alle Modi (einfach, automatisch, fortgeschritten) ohne Erfolg ausprobiert.fileUpload löst kein Ereignis in PrimeFaces 3.5 mit JSF 2.2

Wenn ich Standard-InputFile-Tag aus der JSF-Spezifikation verwenden, funktioniert es ordnungsgemäß.

Dies ist meine web.xml-Datei:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" 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-app_3_1.xsd"> 

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 
<context-param> 
    <param-name>primefaces.THEME</param-name> 
    <param-value>redmond</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>/faces/*</url-pattern> 
</servlet-mapping> 

<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> 

<session-config> 
    <session-timeout> 
     30 
    </session-timeout> 
</session-config> 
<welcome-file-list> 
    <welcome-file>faces/home.xhtml</welcome-file> 
</welcome-file-list> 
</web-app> 

Und dieser Teil meiner Ansicht Seite mit dem Fileupload-Tag ist:

<h:form enctype="multipart/form-data"> 
    <p:dialog id="basicDialog" header="Add pictures" widgetVar="dlg1" > 
     <p:fileUpload fileUploadListener="#{galleryManagedBean.addPicturesToGallery}" multiple="true"/> 
    </p:dialog> 
</h:form> 

Der Extrakt aus Managed Bean mit der Methode, die aufgerufen wird, vom Tag:

Auch ich möchte hinzufügen, dass die Http POST-Anfrage ordnungsgemäß nach I ausgelöst wird überprüft es mit dem Debugger-Tool in Chrome.

Ich habe hinzugefügt notwendige Bibliotheken zu dem Classpath das heißt:

commons-fileupload-1.3.jar 
commons-io-2.4.jar 
+1

PF 3.5 wurde speziell für JSF 2.0/2.1 entwickelt und ist nicht unbedingt mit JSF 2.2 kompatibel. PF 4.0 wurde speziell für/mit JSF 2.2 entwickelt und wurde vor zwei Tagen zufällig veröffentlicht. Ich schlage vor, es zu versuchen. – BalusC

+0

Bingo! Es funktioniert ordnungsgemäß mit PF 4.0. Danke @BalusC! – bajer83

+0

Großartig. Ich habe ein bisschen mehr recherchiert und eine Antwort geschrieben. – BalusC

Antwort

6

Dies wird durch eine Änderung 2.2 in FacesServlet von JSF verursacht wird. Seit dieser Version unterstützt FacesServlet native Datei-Uploads (speziell: multipart/form-data HTTP-Anfragen) dank der Anwesenheit des neuen Servlet 3.0 spezifische @MultipartConfig Annotation. Außerdem wurde eine neue Komponente <h:inputFile> eingeführt, um eine Dateiuploadkomponente im JSF-Standardkomponentensatz anzubieten.

Dies alles widerspricht dem Hochladen von PrimeFaces-Dateien in ältere PrimeFaces 3.x-Versionen, die diese neue JSF 2.2-Funktion überhaupt nicht berücksichtigt haben. Der PrimeFaces 3.x-Filter zum Hochladen von Dateien hat die gesamte Anfrage analysiert und konsumiert, während sie diesen Job auf FacesServlet belassen sollte. Dies führte dazu, dass die FacesServlet die HTTP-Anforderung nicht ordnungsgemäß decodieren konnte (Ermittlung der übermittelten Werte und Aktionen).

PrimeFaces 4.0, das speziell für JSF 2.2 entwickelt wurde, hat dies berücksichtigt. In this changeset des PrimeFaces-Datei-Upload-Filters können Sie die vorgenommenen Änderungen sehen, um JSF 2.2 zu erkennen und das Parsing im Filter zu umgehen. Theoretisch sollte es auch ausreichen, die Datei-Upload-Filter-Registrierung von web.xml komplett zu entfernen, damit diese nicht mehr verwendet wird.

Es sollte gut funktionieren, wenn Sie auf PrimeFaces 4.0 aktualisieren. Es wurde zufällig vor zwei Tagen offiziell veröffentlicht, also bist du pünktlich dafür.