[Resolvido]Imagem não aparece no graphicimage do primefaces

13 respostas
E

To tentando mostrar uma imagem que vem do banco de dados no graphicimage, mas ela não está aparecendo
mostro também o nome e este aparece normal. A minha imagem salvo como byte[] no banco. Abaixo os códigos:

xhtml
<ui:repeat value="#{produtoController.produtos}" var="produto">
                <p:fieldset legend="Simple FieldSet" style="width: 260px">
                    <h:panelGrid columns="1" cellpadding="10">
                        <p:graphicImage value="#{ptoduto.foto}" height="180px" width="250px"/>
                        <h:outputLabel value="#{produto.nome}"/>
                    </h:panelGrid>
                </p:fieldset>
                </ui:repeat>
controller
public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

public ProdutoController() {
        produto = new Produto();
        preencherTabela();
    }

public void preencherTabela() {
        ProdutoDAO produtoDAO = new ProdutoDAO();
        produtos = produtoDAO.getProduto();
    }

13 Respostas

F

Esta linha aqui esta errada não ??

<p:graphicImage value="#{ptoduto.foto}" height="180px" width="250px"/>

Não seria…

<p:graphicImage value="#{produto.foto}" height="180px" width="250px"/>
E

Que falta de atenção né, mas agora que fiz assim está acontecendo esse erro, mas não entendi
porque diz que da erro de String se é imagem ?
Pelo que vi por aí, falam que o graphicImage trabalha com StreamedContent mas minha imagem é Byte[]
só que não consigo converter ela de byte[] para StreamedContent.

java.lang.ClassCastException: [B cannot be cast to java.lang.String at org.primefaces.component.graphicimage.GraphicImageRenderer.getImageSrc(GraphicImageRenderer.java:81) at org.primefaces.component.graphicimage.GraphicImageRenderer.encodeEnd(GraphicImageRenderer.java:39) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295) at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55) at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43) at org.primefaces.component.fieldset.FieldsetRenderer.encodeContent(FieldsetRenderer.java:95) at org.primefaces.component.fieldset.FieldsetRenderer.encodeMarkup(FieldsetRenderer.java:76) at org.primefaces.component.fieldset.FieldsetRenderer.encodeEnd(FieldsetRenderer.java:53) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) at com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:97) at com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:496) at com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:926) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619)

F

Creio que que resolva!

E

Fiz me basenado no exemplo que vc passou mas o erro continua o mesmo

java.awt.image.BufferedImage cannot be cast to java.lang.String

pelo que entendi o <p:graphicImage do PrimeFaces só recebe imagens do tipo StreamedContent
naum recebe byte[] nem BufferdImage e eu naum consigo transformar esses tipos em StreamedContent

Aqui vai os códigos que fiz e o erro
controller

public void visualizaFoto() throws IOException { ProdutoDAO produtoDAO = new ProdutoDAO(); produto = produtoDAO.foto(); img = ImageIO.read(new ByteArrayInputStream(produto.getFoto())); }
xhtml

<p:fieldset legend="Simple FieldSet" style="width: 260px"> <h:panelGrid columns="1" cellpadding="10"> <p:graphicImage value="#{produtoController.img}" height="180px" width="250px"/> <h:outputLabel value="#{produtoController.produto.nome}"/> </h:panelGrid> </p:fieldset>

erro

java.lang.ClassCastException: java.awt.image.BufferedImage cannot be cast to java.lang.String at org.primefaces.component.graphicimage.GraphicImageRenderer.getImageSrc(GraphicImageRenderer.java:81) at org.primefaces.component.graphicimage.GraphicImageRenderer.encodeEnd(GraphicImageRenderer.java:39) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295) at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55) at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43) at org.primefaces.component.fieldset.FieldsetRenderer.encodeContent(FieldsetRenderer.java:95) at org.primefaces.component.fieldset.FieldsetRenderer.encodeMarkup(FieldsetRenderer.java:76) at org.primefaces.component.fieldset.FieldsetRenderer.encodeEnd(FieldsetRenderer.java:53) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620) at com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:97) at com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:496) at com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:926) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619)

Será que alguém tem mais alguma dica ??

F

Eu não salvo imagens em banco,
salvo em arquivo mesmo,
tente assim;

private StreamedContent imagem;
//getters e setters omitidos
BufferedImage img = ImageIO.read(new ByteArrayInputStream(produto.getFoto()));
File file = new File("nome.jpg")
ImageIO.write(img, "jpg", file);
FileInputStream fi = new FileInputStream(file);
imagem = new DefaultStreamedContent(fi);

Eu não testei então num sei se vai funcinar,
Mais axo que ajuda!

E

Estou no trabalho agora, então naum testei ainda,
mas olhando o que me passou fiquei em duvida nessa linha

File file = new File("nome.jpg")

o nome.jpg seria o nome da imagem/foto ??
é que no momento naum salvo o nome da foto, então teria que salvar tbem o nome ??

F

No seu caso que vc salva em banco não é necessario salva nome!!

E

Funcionou mais ou menos, a primeira vez que entro na pagina a foto aparece normal
mas depois se navego para as outras paginas e volto para a que exibe a foto, ela naum aparece mais,
até se eu estiver na pagina e atualizar a foto desaparece então tenho que rodar novamente a aplicação para ela aparecer
pq isso ocorre ?? pq ta no construtor talvez, mas dai como teria que fazer para chamar o metodo visualizaFoto toda vez
que carregar a pagina ??

E tbem vc poderia me explicar o que cada linha faz ??

controller

public void visualizaFoto() throws IOException {
        ProdutoDAO produtoDAO = new ProdutoDAO();
        produto = produtoDAO.foto();
        img = ImageIO.read(new ByteArrayInputStream(produto.getFoto()));
        File file = new File("nome");
        boolean write = ImageIO.write(img, "png", file);
        FileInputStream fi = new FileInputStream(file);
        imagem = new DefaultStreamedContent(fi);
    }

//Construtor onde chamo o metodo para visualizar a foto
public ProdutoController() throws IOException {
        produto = new Produto();
        preencherTabela();
        visualizaFoto();
    }

xhtml

<p:fieldset legend="Simple FieldSet" style="width: 260px"> <h:panelGrid columns="1" cellpadding="10"> <p:graphicImage value="#{produtoController.imagem}" height="180px" width="250px"/> <h:outputLabel value="#{produtoController.produto.nome}"/> </h:panelGrid> </p:fieldset>

F
public void visualizaFoto() throws IOException {
        ProdutoDAO produtoDAO = new ProdutoDAO();
        produto = produtoDAO.foto();
// Lê o arquivo e cria um ByteArrayInputStream e salva no img
        img = ImageIO.read(new ByteArrayInputStream(produto.getFoto()));
// Cria um arquivo ou diretorio como nome que vc colocar
        File file = new File("nome");
// Escreve o arquivo com a extenção escolhida e se der certo retorna um true
        boolean write = ImageIO.write(img, "png", file);
// Cria um FileInputStream com o arquivo
        FileInputStream fi = new FileInputStream(file);
//Cria um DefaultStreamedContent e salva em imagem que é um StreamedContent (tipo de dado que o graphicImage aceita....
        imagem = new DefaultStreamedContent(fi);
    }

Se usar o Netbeans coloque o cursor no metodo e dê CTRL+Spaço que ele te mostra o tipo de retorno do metodo…

Dê uma verificada no seu scopo… se for de request sempre que for feita uma requisição na pagina os dados tendem a sumir
para imagem eu recomendaria o session ou view…

Pra iniciar o metodo quando vc iniciar a pagina veja sobre o PostConstruct pode te ajudar!

E

Pelo que vi esse PostConstruct é do Spring, mas por enquanto não
to trabalhando com o Spring daí eu teria que configura-lo, será que
não tem tipo como criar um metódo ou alguma outra forma ou vc recomenda mesmo
é usar o Spring ??
E o escopo que vc fala é na delcaração do ManagedBean né, se for isso
o meu está como Session.

F

Até onde eu sei o postConstruct é do JSF e não do Spring;
verifique corretamente isto ai!
É estranho com o Session estar sumindo,
vc deve estar zerando ela em algum momento tente fazer o processo debugando de repente vc descobre!

E

Pelo que andei pesquisando no google o PostConstruct existe tanto no
Spring como no JSF.
Consegui resolver o problema, adicionei o PostConstruct no metodo e
no meu escopo eu tinha como session então troquei por request e funcionou
agora a imagem não desaparece mais a cada atualização.

@PostConstruct public void visualizaFoto() throws IOException { ProdutoDAO produtoDAO = new ProdutoDAO(); produto = produtoDAO.foto(); img = ImageIO.read(new ByteArrayInputStream(produto.getFoto())); File file = new File("nome"); boolean write = ImageIO.write(img, "png", file); FileInputStream fi = new FileInputStream(file); imagem = new DefaultStreamedContent(fi); }

E valeu pela ajuda. :thumbup:

R

EHS, estou com mesmo problema que vc estava, tem como postar os codigos completos que fazem este processo do component GraphicImage, por favor…preciso com muita urgencia, obrigado.

Criado 11 de março de 2011
Ultima resposta 3 de abr. de 2012
Respostas 13
Participantes 3