JSF + MyFaces upload pliku

0

Mam problem z wgraniem pliku. Postępuję zgodnie z tutorialem opisanym tutaj http://balusc.blogspot.com/2008/02/uploading-files-with-jsf.html. Kiedy robię sobie taką prościutką aplikację wszystko działa ale gdy próbuję wrzucić to do większego projektu aplikacja wywala się w momencie zatwierdzenia formularza. Dostaję taki komunikat:

2010-01-29 21:19:42 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
        at pl.iwm.LoginUserBean.uploadAvatar(LoginUserBean.java:360)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
        at javax.faces.component.UICommand.broadcast(UICommand.java:383)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)

Metoda uploadAvatar, na która wskazuje pierwszy błąd:

public void uploadAvatar() {

        System.out.println("File type: " + uploadedFile.getContentType());
        System.out.println("File name: " + uploadedFile.getName());
        System.out.println("File size: " + uploadedFile.getSize() + " bytes");

        try {
            //String uploadedFileName = FileUtil.trimFilePath(uploadedFile.getName());
            File uniqueFile = FileUtil.uniqueFile(new File("/home/me/upload"), this.login);
            FileUtil.write(uniqueFile, uploadedFile.getInputStream());

            FacesContext.getCurrentInstance().addMessage("fileupload", new FacesMessage(
                    FacesMessage.SEVERITY_INFO, "File upload succeed!", null));

        } catch (IOException e) {

            FacesContext.getCurrentInstance().addMessage("fileupload", new FacesMessage(
                    FacesMessage.SEVERITY_ERROR, "File upload failed with I/O error.", null));

        }
    }

Błąd wskazuje na linię, w której pierwszy raz próbuję się odwołać do uploadowanego pliku.

Mój web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</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>
        <servlet-name>BinaryServlet</servlet-name>
        <servlet-class>pl.iwm.tools.BinaryServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>MakeUserBean</servlet-name>
        <servlet-class>pl.iwm.tools.MakeUserBean</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Logout</servlet-name>
        <servlet-class>pl.iwm.tools.Logout</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LoginError</servlet-name>
        <servlet-class>pl.iwm.tools.LoginError</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>DeleteAccount</servlet-name>
        <servlet-class>pl.iwm.tools.DeleteAccount</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>BinaryServlet</servlet-name>
        <url-pattern>/BinaryServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MakeUserBean</servlet-name>
        <url-pattern>/MakeUserBean</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Logout</servlet-name>
        <url-pattern>/Logout</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>LoginError</servlet-name>
        <url-pattern>/LoginError</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>DeleteAccount</servlet-name>
        <url-pattern>/DeleteAccount</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.jsp</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Secured</web-resource-name>
            <url-pattern>/faces/www/secured/*</url-pattern>
            <http-method>DELETE</http-method>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>PUT</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/faces/www/loginForm.jsp</form-login-page>
            <form-error-page>/faces/www/loginForm.jsp</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <role-name>user</role-name>
    </security-role>
    <security-role>
        <role-name>admin</role-name>
    </security-role>
    <security-role>
        <role-name>manager</role-name>
    </security-role>
    <error-page>
        <error-code>403</error-code>
        <location>/LoginError</location>
    </error-page>
    <filter>
        <filter-name>Extensions Filter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Extensions Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
</web-app>

W jednym z komentarzy autor wspomniał, że powodem NullPointerException może być

Either you didn't select a file for upload or the extensions filter is not installed/configured/mapped properly.

Pomocy [???]

0

Po ciężkiej nocy googlowania nadal nie mogę rozwiązać tego problemu. Znalazłem tylko coś o mapowaniu Faces Servlet. Moje teraźniejsze ustawienia powodują takie coś, że jak uruchamiam konkretnie welcome-file czyli index.jsp wszystko działa poprawnie, linki przenoszą mnie tam gdzie chce itd., oczywiście do czasu wgrania obrazka. Wtedy wszystko się sypie. Gdy startuje projekt otwiera mi się welcome file, ale żaden z linków w nim zawartych nie kieruje mnie tam gdzie powinien. Więc może coś z tym mapowaniem jest źle? Sam nic w tym nie mieszałem, jest takie jakie ustawia się w netbeansie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1