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:
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)
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
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)
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();
}
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);
}
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.