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

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

[code]
public List 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();
}[/code]

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"/>  

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)

Creio que que resolva!

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 ??

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!

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 ??

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

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>

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!

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.

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!

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:

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.