p:未触发fileUpload方法

时间:2012-01-09 09:05:01

标签: jsf file-upload primefaces

我有一个带有p:fileUpload的表单,当我提交表单时,不会触发所有方法

这是我的xhtml:

<h:form enctype="multipart/form-data">
          <p:messages id="messages" showDetail="true"/>
          <p:fileUpload value="#{uploadBean.file}" mode="simple" id="fileUploadId"/>
          <p:commandButton value="Envoyer ce fichier" process="@form" update="messages fileUploadId" actionListener="#{uploadBean.upload}"/>
</h:form>

我的豆子:

public void setFile(final UploadedFile file)
  {
    System.out.println("Dans le setFile");
    this.file = file;
  }

  public void upload()
  {
    System.out.println("Dans le upload");
    System.out.println("Fichier : " + file.getFileName());
    FacesContext.getCurrentInstance().addMessage(null, msg);
  }

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

在追踪中,我只是:

Infos: Dans le upload
Grave: Réception de «java.lang.NullPointerException» lors de l’invocation du listener d’action «#{uploadBean.upload}» du composant «j_idt11»
Grave: java.lang.NullPointerException

方法setFile()不是调用...

由于

编辑: 我的bean的所有代码:

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

@ManagedBean
@ViewScoped
public class UploadBean implements Serializable
{
  /**
   * 
   */
  private static final long serialVersionUID = 556636819990963651L;

  private UploadedFile      file;

  public UploadedFile getFile()
  {
    System.out.println("Dans le getFile");
    return file;
  }

  public void setFile(final UploadedFile file)
  {
    System.out.println("Dans le setFile");
    this.file = file;
  }

  public void upload()
  {
    System.out.println("Dans le upload");
    // System.out.println("Fichier : " + file.getFileName());

    FacesMessage msg;
    if (file == null)
    {
      msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Raté ! ", "Le fichier vaut null.");
      System.out.println("la variable file : null");
    }
    else
    {
      msg = new FacesMessage("Ouép ! ", file.getFileName() + " is uploaded.");
      System.out.println("Le nom du fichier uploader est : " + file.getFileName());
    }
    FacesContext.getCurrentInstance().addMessage(null, msg);
  }
}

3 个答案:

答案 0 :(得分:1)

从你提供的内容来看,我认为你到目前为止已经做得很好。但是,您仍需要处理两件事:

  1. 您需要下载common-io&amp; common-fileupload并将.jar文件导入您的资料库文件夹。
  2. 您还需要确保web.xml中没有其他过滤器或任何使用@WebFilter注释的类,这些过滤器可能会在PrimeFaces过滤器之前读取HttpServletRequest#getInputStream(),因为它可能是只读一次。

答案 1 :(得分:1)

你也在使用prettyfaces?然后尝试(设置调度员):

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

答案 2 :(得分:0)

我有一个类似的问题,表单未提交,并且从未调用过setters方法,添加

<f:ajax event="change"/> 

在组件内部您想要提交的内容。还

"immediate=true"

关于组件本身。思想可能对其他人有所帮助。