Recuperar Imagem do banco e mostrar

Pessoal

Estou desenvolvendo uma aplicação web com jsf e primefaces.
Estou tentando listar umas imagens que eu inseri no banco, porém quando tento colocar no meu jsp, dá o seguinte erro:


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:883)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:59)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:57)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeTable(DataGridRenderer.java:165)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeMarkup(DataGridRenderer.java:76)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeEnd(DataGridRenderer.java:52)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1659)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	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:509)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:637)

Alguém poderia me ajudar? as fotos estão inseridas em um Array de Bytes

Bjs!

veja:

    java.lang.ClassCastException: [B cannot be cast to java.lang.String  

Esta acontecendo um erro de Cast, faça uma verificação onde vc esta realizando os Cats.
Post seu completo e sua Página.

Não seria mais viável vc fazer o upload dessa imagem pro seu servidor e armazenar somente o caminho desta imagem?

Você está tentando converter algo pra uma String, provavelmente algo que não pode ser convertido pra String,
as imagens estão numa base de dados? O que está usando pra fazer essa “seleção” da imagem?

Você deve estar passando um File ou um array de bytes onde o componente espera o caminho no disco.

Meninos,

em primeiro lugar, obrigada por me responderem…

Então, o meu select está assim:


public List<ProdutoEntity> listarProdutos() throws SQLException, IOException{
        List<ProdutoEntity> listaProdutos = new ArrayList<ProdutoEntity>();
        con = ConnectionFactory.getMySQLConnection();
        StringBuffer str = new StringBuffer();
        str.append("SELECT");
        str.append(" CODIGO ");
        str.append(" ,PRODUTO ");
        str.append(" ,DESCRICAO ");
        str.append(" ,IMAGEM ");
        str.append(" FROM ");
        str.append(" produto ");
        
        PreparedStatement pstm = (PreparedStatement)con.prepareStatement(str.toString());
        ResultSet rs = pstm.executeQuery();
        
        while(rs.next()){
            ProdutoEntity produto = new ProdutoEntity();
            produto.setCodigo(rs.getInt("CODIGO"));
            produto.setProduto(rs.getString("PRODUTO"));
            produto.setDescricao(rs.getString("DESCRICAO"));
            produto.setImagem(rs.getBytes("IMAGEM"));
            
            listaProdutos.add(produto);
        }
        con.close();        
        return listaProdutos;
    }

No meu banco, a imagem está sendo salva como BLOB. Para salvar está OK, o problema é que na hora que eu tento mostrar no meu jsf, dá erro… O meu jsf está assim


<p:dataGrid var="produto" value="#{produtoController.produtos}" columns="3"
		rows="12" paginator="true" effect="true"
		paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
		rowsPerPageTemplate="9,12,15">
		
		<p:column>
			<p:graphicImage value="#{produto.imagem}"/>
			 <h:outputText value="#{produto.produto}"/>
			 <br/>
			 &lt;h:outputText value="#{produto.descricao}"/&gt;
		&lt;/p:column&gt;
	&lt;/p:dataGrid&gt;
	

E por fim, meu stackTrace


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:883)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:59)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:57)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeTable(DataGridRenderer.java:165)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeMarkup(DataGridRenderer.java:76)
	at org.primefaces.component.datagrid.DataGridRenderer.encodeEnd(DataGridRenderer.java:52)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1659)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	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:509)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:637)

Estou a mais de uma semana tentando e não consigo… =/

Se puderem me ajudar… :slight_smile:

Foi exatamente o que eu pensei.

O Componente que você está tentando usar exibe apenas imagem que estão no disco. Para usa-lo será necessário gravar o array de bytes no hd.
A segunda opção é usar um richfaces da vida, ou um primefaces, eles possuem componentes de imagem que você necessita?

Você está usando jsf puro ?

estou com o mesmo problema… usando primefaces
alguem resolveu?