2013-10-04 12 views
6

Nie mogę utworzyć komponentu fileUpload na PrimeFaces 3.5, aby wystrzelić zdarzenie. Przeczytałem wiele postów na ten temat i poszedłem doradzić, ale nadal nie działa. Wypróbowałem wszystkie tryby (prosty, automatyczny, zaawansowany) bez powodzenia.fileUpload nie wywołuje zdarzenia w PrimeFaces 3.5 z JSF 2.2

Jeśli użyję standardowego znacznika inputFile ze specyfikacji JSF, to działa poprawnie.

To jest mój plik web.xml:

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

I to jest część mojej stronie widoku z tagiem FileUpload:

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

Ekstrakt z zarządzanego fasoli z metodą, która jest wywoływana z tagu:

@Named(value = "galleryManagedBean") 
@RequestScoped 
public class GalleryManagedBean { 
    public void addPicturesToGallery(FileUploadEvent event) 
    { 
     System.out.println("Triggered upload"); 
    } 
} 

Chciałbym dodać, że żądanie HTTP POST jest uruchamiane poprawnie po I sprawdziłem to za pomocą narzędzia do debugowania w Chrome.

I dodano niezbędne bibliotek ścieżka klasy to:

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

PF 3.5 został opracowany specjalnie dla JSF 2.0/2.1 i niekoniecznie musi działać z JSF 2.2. PF 4.0 jest opracowany specjalnie dla/z JSF 2.2 i przypadkowo został wydany zaledwie 2 dni temu. Proponuję spróbować. – BalusC

+0

Bingo! Działa poprawnie z PF 4.0. Dziękuję @BalusC! – bajer83

+0

Świetnie. Zrobiłem trochę więcej badań i wysłałem odpowiedź. – BalusC

Odpowiedz

6

jest to spowodowane przez zmianę FacesServlet JSF 2.2. Od tej wersji, FacesServlet natywnie obsługuje wysyłanie plików (w szczególności: multipart/form-data żądań HTTP) dzięki obecności nowej adnotacji @MultipartConfig specyficznej dla Servlet 3.0. Wprowadzono również nowy komponent <h:inputFile>, który oferuje komponent do przesyłania plików w standardowym zestawie komponentów JSF.

Wszystko to powoduje konflikty z funkcją przesyłania plików PrimeFaces w starszych wersjach PrimeFaces 3.x, które w ogóle nie uwzględniały nowej funkcji JSF 2.2. Filtr przesyłania plików PrimeFaces 3.x przeanalizował i pochłonął całe żądanie, podczas gdy powinien pozostawić to zadanie do FacesServlet. To spowodowało, że FacesServlet nie może poprawnie zdekodować żądania HTTP (określając przesłane wartości i akcje).

PrimeFaces 4.0, który został zaprojektowany specjalnie dla JSF 2.2, wziął to wszystko pod uwagę. W polu this changeset filtru przesyłania plików PrimeFaces można zobaczyć zmiany wykonane w celu rozpoznania JSF 2.2 i obejścia parsowania w filtrze. Teoretycznie powinno również wystarczyć całkowite usunięcie rejestracji filtru uploadu plików z web.xml, aby nie było już używane.

To powinno działać poprawnie, jeśli uaktualnisz do PrimeFaces 4.0. Zostało to oficjalnie wydane dwa dni temu, więc jesteś na to gotowy.

Powiązane problemy