Imagem do primeFaces graphicImage desaparece quando dou refresh na página [RESOLVIDO]

Bom dia,

Estou utilizando o graphicImage do primeFaces.

Quando entro na pagina a imagem padrão aprece numa boa, porém quando aperto F5 a imagem desaparece.

Procurei no Mr. Google, e não encontrei nenhuma solução para isso.

Se alguém puder ajudar, eu agradeço.

O código da parte da página é o seguinte:

                    <h:panelGrid columns="2" cellpadding="2" >
                        <p:graphicImage id="gpiFoto" value="#{cadastroDePessoaBean.stcImagem}" width="125" height="150" cache="false" styleClass="Foto_Padrao" />
                        <h:panelGrid columns="1" cellpadding="1">
                            <p:fileUpload id="fluFotos" auto="true" image="//resources//images//upload.gif" 
                                          width="16" height="16" allowTypes="*.gif; *.png; *.jpg" description="imagem" 
                                          fileUploadListener="#{cadastroDePessoaBean.fileUploadAction}" update="gpiFoto" 
                                          customUI="false" wmode="false" widgetVar="uploader" sizeLimit="204800" />
                            <h:commandLink id="cmdLimparFoto" actionListener="#{cadastroDePessoaBean.limparFoto}" >
                                <h:graphicImage id="gpiLimparFoto" value="//resources//images//limpar.gif" width="10" height="10" />
                                <f:ajax render="gpiFoto" />
                            </h:commandLink>
                        </h:panelGrid>
                    </h:panelGrid>

e o código do Bean é esse:

@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
    @EJB
    private ImagemDao imagemDao;
    private Imagem imagem;
    private StreamedContent stcImagem;

    public StreamedContent getStcImagem() {
        return stcImagem;
    }

    public void setStcImagem(StreamedContent stcImagem) {
        this.stcImagem = stcImagem;
    }

    public Imagem getImagem() {
        return imagem;
    }

    public void setImagem(Imagem imagem) {
        this.imagem = imagem;
    }

    public void fileUploadAction(FileUploadEvent event) {
        try {
            stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
            imagem = new Imagem(event.getFile().getContents());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        stcImagem = new DefaultStreamedContent(io);
        imagem = null;
    }
}

Quando dou refresh na página, nenhum método ou função do Bean é executado.

debuga o código e verifica qual o caminho ele chama no refresh. Verifique também no firebug aonde está a referência. Posta o que aparece pra gente.

Quando inicio pela primeira vez ele executa a seguinte sequencia de código:


    public CadastroDePessoaBean() {
        init();
    }

    private void init() {
        limparFoto(null);

        strAtual = "newpessoa";

        pessoaFisica = new PessoaFisica();
        email = new Email();
        endereco = new Endereco();
        logradouro = new Logradouro();

        imagens = new ArrayList<Imagem>();
        enderecos = new ArrayList<Endereco>();


        sexos = Sexo.list();
    }

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        stcImagem = new DefaultStreamedContent(io, "image/png", "Foto");
        imagem = null;
    }

    public StreamedContent getStcImagem() {
        return stcImagem;
    }

quando pressiono F5 ele executa apenas o getStcImagem() que apresenta em seu conteúdo o mesmo que já existia quando setei ao iniciar (a imagem padrão).

    public StreamedContent getStcImagem() {
        return stcImagem;
    }

conforme disse no topo do tótipo, o código do graphicImage é o seguinte:

<p:graphicImage id="gpiFoto" value="#{cadastroDePessoaBean.stcImagem}" width="125" height="150" cache="false" styleClass="Foto_Padrao" />

O que deve ser. Já testei no IE e no Chrome, acontece a mesma coisa, a imagem na página desaparece ao pressionar F5.

[img]




qual o escopo que está o seu mb?

Está com o escopo SessionScoped

@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {

No seu ManagedBean altere-o como descrito abaixo.

@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
    @EJB
    private ImagemDao imagemDao;
    private Imagem imagem;
    private StreamedContent stcImagem;
    private FileUploadEvent fue;


    public StreamedContent getStcImagem() {
        return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
    }

    public void setStcImagem(StreamedContent stcImagem) {
        this.stcImagem = stcImagem;
    }

    public Imagem getImagem() {
        return imagem;
    }

    public void setImagem(Imagem imagem) {
        this.imagem = imagem;
    }

    public void fileUploadAction(FileUploadEvent event) {
        try {
            //stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
            this.fue = event;
            imagem = new Imagem(event.getFile().getContents());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        stcImagem = new DefaultStreamedContent(io);
        imagem = null;
    }
}

Vilsonei, obrigado.

Fiz o que você descreveu e funcionou legal.

Se não for pedir muito, como faço para que a imagem default, que aparece ao clicar no botão limpar, que executa o método limparFoto(), permaneça após o pressionamento da tecla F5 (refresh).

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        final InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        stcImagem = new DefaultStreamedContent(io, "image/png", "Foto");
        
        imagem = null;
    }

É só alterar a sua classe conforme abaixo.


@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
    @EJB
    private ImagemDao imagemDao;
    private Imagem imagem;
    private StreamedContent stcImagem;
    private FileUploadEvent fue;
    private InputStream io;


    public StreamedContent getStcImagem() {
        if (imagem != null)
            return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
        else
            return stcImagem = new DefaultStreamedContent(io);
    }

    public void setStcImagem(StreamedContent stcImagem) {
        this.stcImagem = stcImagem;
    }

    public Imagem getImagem() {
        return imagem;
    }

    public void setImagem(Imagem imagem) {
        this.imagem = imagem;
    }

    public void fileUploadAction(FileUploadEvent event) {
        try {
            //stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
            this.fue = event;
            imagem = new Imagem(event.getFile().getContents());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        //InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        //stcImagem = new DefaultStreamedContent(io);
        imagem = null;
    }
}

Boa noite vilsonei, obrigado mais uma fez.

Não deu certo com o io sendo passado como parametro no getStrImagem.

    public StreamedContent getStcImagem() {
        try {
            if (imagem != null) {
                stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(), fue.getFile().getContentType(), fue.getFile().getFileName());
            }else{
                stcImagem = new DefaultStreamedContent(io);
            }
        } catch (IOException ex) {
            Logger.getLogger(CadastroDePessoaBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        return stcImagem;
    }

continua dando o mesmo problema para a imagem default. Em questão a imagem escolhida pelo fileupload continua tudo legal.
mas quando coloco a imagem padrão e aperto F5 a imagem some.

jrfercar, tente desta forma, eu não testei este código, mas acredito que irá dar certo, pois o componente p:graphicImage precisa ser alimentado diretamente da fonte de dados.

@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
    @EJB
    private ImagemDao imagemDao;
    private Imagem imagem;
    private StreamedContent stcImagem;
    private FileUploadEvent fue;
//    private InputStream io;


    public StreamedContent getStcImagem() {
        if (imagem != null)
            return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
        else
            //return stcImagem = new DefaultStreamedContent(io);
           return stcImagem = new DefaultStreamedContent(context.getExternalContext().getResourceAsStream("//resources//images//profile.gif")); 
    }

    public void setStcImagem(StreamedContent stcImagem) {
        this.stcImagem = stcImagem;
    }

    public Imagem getImagem() {
        return imagem;
    }

    public void setImagem(Imagem imagem) {
        this.imagem = imagem;
    }

    public void fileUploadAction(FileUploadEvent event) {
        try {
            //stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
            this.fue = event;
            imagem = new Imagem(event.getFile().getContents());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void limparFoto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        //InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        //io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
        //stcImagem = new DefaultStreamedContent(io);
        imagem = null;
    }
}

Mais uma vez muito obrigado vilsonei,

Realmente, para se trabalhar com o graphicImage é necessário alimentar a imagem diretamente.

Fiz como você disse e deu certo.

    public StreamedContent getStcImagem() {
        try {
            if (imagem != null) {
                stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(), fue.getFile().getContentType(), fue.getFile().getFileName());
            }else{
                stcImagem = new DefaultStreamedContent(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("//resources//images//profile.gif"));
            }
        } catch (IOException ex) {
            Logger.getLogger(CadastroDePessoaBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        return stcImagem;
    }

valeu mesmo.

Beleza cara, qualquer coisa estamos aí!