[Resolvido] fileUpload Primefaces, não preenche componente mbean

View:

<h:form id="form" enctype="multipart/form-data">
	<p:fileUpload value="#{mBean.arquivo}" mode="simple" />
	<h:commandButton value="Enviar" action="#{mBean.upload}">
		<f:ajax render="@form" execute="@form" />
	</h:commandButton>
</h:form>

Mbean:

[code]
@Named
@ViewScoped
public class mBean implements Serializable {
private UploadedFile arquivo;

public void upload() {
	System.out.println(arquivo.getFileName());
}

public UploadedFile getArquivo() {
	return arquivo;
}

public void setArquivo(UploadedFile arquivo) {
	this.arquivo = arquivo;
}

}[/code]

O arquivo nunca é preenchido, lançando uma NullPointerException sempre que clico no botão.

O que há de errado?

Qual versão do Prime você está usando?

na verdade acho que nem importa… falo por experiência própria quando digo que nunca consegui fazer isso funcionar no modo simples…

Noite amigos,

Espero que te ajude nesse caso o meu está funcionando, sofri um pouco mas um amigo me ajudou solucionar a questão de gerar apenas uma arquivo temporario e quando fechava a aplicação ele sumia, segue.
Utilizei
Primefaces 2.2.1
Glassfish
EJB 3

*Obs. não esquecer de add dois jar
commons-fileupload.jar (estou usando a versão 1.2.2)
commons-io (estou usando a versão 2.1)

XHTML

&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui"&gt;

    &lt;body&gt;
        &lt;ui:define name="script"&gt;
                &lt;style type="text/css"&gt;
                    div#tudo {width: 800px;}
                &lt;/style&gt;
            &lt;/ui:define&gt;
            &lt;ui:define name="content"&gt;
                &lt;p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/&gt;
                &lt;h:form&gt;
                &lt;p:fileUpload fileUploadListener="#{anexoMB.fileUploadAction}" label="Selecionar..." update="messages"  sizeLimit="9999999" 
                                    allowTypes="/(\.|\/)(gif|jpe?g|png|txt|pdf|doc)$/" multiple="false"  auto="true" /&gt;  
                 &lt;p:messages id="messages" showDetail="true"/&gt;
              &lt;/h:form&gt;
            &lt;/ui:define&gt;
        &lt;/ui:composition&gt;
    &lt;/body&gt;
&lt;/html&gt;

ManagedBean

package apresentacao.managedbean;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;
import negocio.entidade.Anexo;
import negocio.fachada.AnexoFachada;
import org.apache.commons.io.FilenameUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

@ManagedBean(name = "anexoMB")
@SessionScoped
public class AnexoMB{

    private Anexo anexo;
    private ListDataModel anexos;
    private byte[]img;
    private StreamedContent file;
    
    @EJB
    private AnexoFachada anexoFachada;
    
    public void AnexoMB(){}

    public Anexo getAnexo() {
        return anexo;
    }

    public void setAnexo(Anexo anexo) {
        this.anexo = anexo;
    }
    
    public StreamedContent getFile() {return file;}
    public void setFile(StreamedContent file) {this.file = file;}
    
    public void recuperarAnexo() {
        this.anexo = (Anexo) this.anexos.getRowData();
    }
    
    public String montarPaginaParaInsercao() {
        this.anexo = new Anexo();
        return "/anexo/InserirAnexo";
    }
    
    public void fileUploadAction(FileUploadEvent e) throws IOException {  
	try{
		 UploadedFile arq = e.getFile();
		 InputStream in = new BufferedInputStream(arq.getInputstream());
                 //File file = new File("c:/arquivo/imagem/ + arq.getInputstream());
                 File file = new File("c:/arquivo/imagem/" + arq.getFileName());
		 //File file = new File("c:/arquivo/imagem/teste/" + arq.getInputstream());
		 FileOutputStream fout = new FileOutputStream(file);
		while (in.available() != 0) { 
		   fout.write(in.read()); 
	   } 
	   fout.close(); 
	   FacesMessage msg = new FacesMessage("O Arquivo ", file.getName()  + " salvo."); 
	   FacesContext.getCurrentInstance().addMessage("msgUpdate", msg); 
	} 
	catch (Exception ex) { 
	   ex.printStackTrace();
        }
    }
}

Classe (Entidade)

package negocio.entidade;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "anexo")
@NamedQueries({
    @NamedQuery(name = "Anexo.findAll", query = "SELECT a FROM Anexo a"),
    @NamedQuery(name = "Anexo.findByAnexoId", query = "SELECT a FROM Anexo a WHERE a.anexoId = :anexoId"),
    @NamedQuery(name = "Anexo.findByCaminho", query = "SELECT a FROM Anexo a WHERE a.caminho = :caminho"),
    @NamedQuery(name = "Anexo.findByNome", query = "SELECT a FROM Anexo a WHERE a.nome = :nome")})
public class Anexo implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "anexo_id", nullable = false)
    @SequenceGenerator(name="Anexo_Generator", sequenceName="anexo_sequence", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Anexo_Generator")  
    private Integer anexoId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "caminho", nullable = false, length = 255)
    private String caminho;
    @Size(max = 255)
    @Column(name = "nome", length = 255)
    private String nome;
    @Lob
    @Column(name = "arquivo")
    private byte[] arquivo;

    public Anexo() {
    }

    public Anexo(Integer anexoId) {
        this.anexoId = anexoId;
    }

    public Anexo(Integer anexoId, String caminho) {
        this.anexoId = anexoId;
        this.caminho = caminho;
    }

    public Integer getAnexoId() {
        return anexoId;
    }

    public void setAnexoId(Integer anexoId) {
        this.anexoId = anexoId;
    }

    public String getCaminho() {
        return caminho;
    }

    public void setCaminho(String caminho) {
        this.caminho = caminho;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public byte[] getArquivo() {
        return arquivo;
    }

    public void setArquivo(byte[] arquivo) {
        this.arquivo = arquivo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (anexoId != null ? anexoId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Anexo)) {
            return false;
        }
        Anexo other = (Anexo) object;
        if ((this.anexoId == null && other.anexoId != null) || (this.anexoId != null && !this.anexoId.equals(other.anexoId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "negocio.entidade.Anexo[ anexoId=" + anexoId + " ]";
    }
    
}

Fachada

package negocio.fachada;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import negocio.entidade.Anexo;
import persistencia.AnexoDAO;

@Stateless
public class AnexoFachada {
    
    @EJB
    private AnexoDAO anexoDAO;
    private Anexo anexo;
    
    public void inserir(Anexo anexo) {
        anexoDAO.inserir(anexo);
    }
    
    public Anexo recuperarPorId(Integer id) {
        return anexoDAO.recuperarPorId(id);
    }

    public void inserir(byte[] img) {
        anexoDAO.inserir(anexo);
    }
}

Persistencia

package persistencia;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import negocio.entidade.Anexo;

@Stateless
public class AnexoDAO {

    @PersistenceContext
    private EntityManager em;

    public void inserir(Anexo anexo) {
        em.persist(anexo);
        em.merge(anexo);
        
    }

    public Anexo recuperarPorId(Integer id) {
        return em.find(Anexo.class, id);
    }
}

Adicinei esse trecho no meu
Web.xml

&lt;filter&gt;
    &lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.primefaces.webapp.filter.FileUploadFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;uploadDirectory&lt;/param-name&gt;
        &lt;param-value&gt;C:/arquivo/imagem&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;thresholdSize&lt;/param-name&gt;
        &lt;param-value&gt;10000&lt;/param-value&gt;
    &lt;/init-param&gt;
  &lt;/filter&gt;
  &lt;filter-mapping&gt;
    &lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
  &lt;/filter-mapping&gt;

então… só que o seu não está no modo simples…

o componente de upload do prime teve grandes mudanças no lançamento da versão 3, mas ainda assim não consegui fazer funcionar na versão simples…
na verdade depois de quebrar a cara com o da 2.1, não tentei o da 3 com tanto afinco… o do Tomahawk funciona sem problemas hehehe

não é modo simples, mas o benigno mosta muito bem como tratar do upload com primefaces

Adaptei os exemplos ao meu código:
MBean:

[code]
@Named
@ViewScoped
public class MBean implements Serializable {

private UploadedFile arquivo;

public void upload(FileUploadEvent event) {
	arquivo = event.getFile();
}

public void validar() {
	try {
		System.out.prinln(arquivo.getFileName());
	} catch (Exception e) {
		System.out.println("Null pointer");
	}
}

}[/code]

XHTML:

<h:form enctype="multipart/form-data"> <p:fileUpload fileUploadListener="#{pedidoArquivoBean.upload}" multiple="false" mode="simple" /> <h:commandButton value="PRÓXIMA ETAPA" action="#{pedidoArquivoBean.validarPedido}"> <f:ajax render="@form" execute="@form" /> </h:commandButton> </h:form>

Coloquei Breakpoints nos métodos validar() e upload(). Seleciono o arquivo, clico no botão, somente o breakpoint de validar é ativado.
O atributo arquivo continua null.

Começa a me bater um certo desespero quanto a isso…rs

se você usar o fileUploadListener não pode mais deixar mode=“simple”

Te amo, cara