Erro JSF/Hibernate insert tipo byte[] mapeamento blob (ajuda por favor!)

8 respostas
kurama

pessoal estou tendo o seguinte erro

exception

javax.servlet.ServletException: Error calling action method of component with id _id0:_id2
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:121)
	org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)

root cause

javax.faces.FacesException: Error calling action method of component with id _id0:_id2
	org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
	javax.faces.component.UICommand.broadcast(UICommand.java:106)
	javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:90)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:164)
	org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:316)
	org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:106)
	org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)

alguem saberia me dizer o pq desse erro? ele acontece quando eu tento inserir um tipo byte[] num campo blob usando funções geradas automaticamentes pelo Exadel/Hibernate, ou seja, o problema nao eh em nada que eu tenha criado.
eu tenho uma classe Imagens que contem um id e um array de bytes[], no mapeamento automatico do hibernate ele mapeou essa classe para um tipo blob para o byte[] e um integer para id.
depois disso eu gerei automaticamente as classes DAO para imagens que realiza os comandos insert, update, delete, etc para a tabela referente a minha classe Imagens.
quando tendo usar o metodo insert da classe gerada dá pau. estranho eh que usei esse metodo gerado automaticamente, para outras classes que nao tem o tipo byte[] mas apenas string, e outros tipos triviais e a inserção funciona belezinha, mas quando fui tentar para um tipo byte[] retronou esse problema.
e o estranho eh que o problema nao parece ser no hinernate e sim em algo no servlet.
bom, espero ter sido claro, tuo precisando com um pouco de urgencia hihihi, se alguem souber, serei grato.

8 Respostas

Anderson_Schmidt

kurama,

O erro de chamada do método me faz pensar que ele nem chegou na inserção propriamente dita.
  Como está seu faces-config.xml? Está apontando pra classe correta? O método tem retorno é público com retorno String?
  Parece ser mesmo algum erro de "configuração" ... se fosse erro com o tipo de dado/banco a stack seria mais indicatiiva.

Flws.

ldanielts

Cara,

Está com a cara de um problema que eu já tive.
Mas, pra saber se é mesmo, gostaria que você mandasse o stack trace inteiro.

Veja se na trace tem alguma ArrayIndexOutOfBounds.

Um abraço.

kurama
ldanielts:
Cara,

Está com a cara de um problema que eu já tive.
Mas, pra saber se é mesmo, gostaria que você mandasse o stack trace inteiro.

Veja se na trace tem alguma ArrayIndexOutOfBounds.

Um abraço.

como pego o stacktrace completo? esse ai eh o que eh retornado na pagina, quando o erro acontece.

vou colocar aqui as classes queestou usando para vcs verem, mas acho que o faces-config.xml e o resto tá tudo okei.

Imagens.java (classe que contem o array de byte e o integer id)
package dominio;

public class Imagens {
	private byte[] documento;	
	private Integer id;

	public byte[] getDocumento() {
		return documento;
	}

	public void setDocumento(byte[] documento) {
		this.documento = documento;
	}	
	
	public Integer getId() {
		return this.id;
	}
	
	public void setId(Integer value) {
		this.id = value;
	}
}
TesteUploadBean.java (managed bean)
package logica;

import java.io.IOException;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import dominio.Imagens;
import persistencia.ImagensDAO;
import persistencia.ImagensDAOImpl;

public class TesteUpload {
	private UploadedFile arquivo;

	public UploadedFile getArquivo() {
		return arquivo;
	}

	public void setArquivo(UploadedFile arquivo) {
		this.arquivo = arquivo;
	}
	
	public String acao() {
		try {
			Imagens imgAux = new Imagens();
			imgAux.setDocumento(arquivo.getBytes());			
			ImagensDAO imgAux2 = new ImagensDAOImpl();			
			imgAux2.insert(imgAux);
		} catch (IOException e) {
			System.out.println("Erro!");			
		}
		return "rsUpload";
	}
	
	public String volta() {
		return "upload";
	}	
}
ImagensDAOImpl.java (classe gerada automaticamente, faz as funções de insert, delete, etc)
/* Auto generated file */

package persistencia;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import java.util.List;
import org.hibernate.Criteria;
import dominio.Imagens;
import java.util.Iterator;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Order;
import org.hibernate.LockMode;

import util.HibernateUtil;

public class ImagensDAOImpl implements ImagensDAO {

	static private final Log log = LogFactory.getLog(ImagensDAOImpl.class);

	public Session getSession() {
		return HibernateUtil.currentSession();
	}

	/** auto generated
	 * @es_generated
	 */
	public List getAll() {
		List values = null;
		Session session = getSession();
		Criteria allValues = session.createCriteria(Imagens.class);
		values = allValues.list();
		return values;
	}

	/** auto generated
	 * @es_generated
	 */
	public Iterator iterateAll() {
		return getAll().iterator();
	}

	/** auto generated
	 * @es_generated
	 */
	public Imagens getById(Integer id) {
		Imagens value = null;
		Session session = getSession();
		value = (Imagens) session.load(Imagens.class, id);
		return value;
	}

	/** auto generated
	 * @es_generated
	 */
	public List findByCriteria(SearchCriteria criteria) {
		List values = null;
		Session session = getSession();
		Criteria crit = getHBCriteria(session, criteria);
		if (criteria.startFrom < criteria.maxResults && criteria.startFrom > -1) {
			crit.setFirstResult(criteria.startFrom);
			crit.setMaxResults(criteria.maxResults - criteria.startFrom);
		}
		values = crit.list();
		return values;
	}

	/** auto generated
	 * @es_generated
	 */
	private Criteria getHBCriteria(Session session, SearchCriteria criteria) {
		Criteria newCriteria = session.createCriteria(Imagens.class);
		if (criteria.getId() != null) {
			newCriteria.add(Restrictions.eq("id", criteria.getId()));
		}
		if ((criteria.ascending != null) && (criteria.ascending.contains("id")))
			newCriteria.addOrder(Order.asc("id"));
		else if ((criteria.descending != null)
				&& (criteria.descending.contains("id")))
			newCriteria.addOrder(Order.desc("id"));
		if (criteria.getDocumento() != null) {
			newCriteria.add(Restrictions.eq("documento", criteria
					.getDocumento()));
		}
		if ((criteria.ascending != null)
				&& (criteria.ascending.contains("documento")))
			newCriteria.addOrder(Order.asc("documento"));
		else if ((criteria.descending != null)
				&& (criteria.descending.contains("documento")))
			newCriteria.addOrder(Order.desc("documento"));
		return newCriteria;
	}

	/** auto generated
	 * @es_generated
	 */
	public void insert(Imagens value) {
		Session session = getSession();
		session.save(value);
		if (log.isDebugEnabled())
			log.debug("inserting document: " + value);
	}

	/** auto generated
	 * @es_generated
	 */
	public void update(Imagens value) {
		Session session = getSession();
		session.update(value);
		if (log.isDebugEnabled())
			log.debug("updating document: " + value);
	}

	/** auto generated
	 * @es_generated
	 */
	public Imagens merge(Imagens value) {
		Imagens newValue = null;
		Session session = getSession();
		newValue = (Imagens) session.merge(value);
		if (log.isDebugEnabled())
			log.debug("merging document: " + value);
		return newValue;
	}

	/** auto generated
	 * @es_generated
	 */
	public void delete(Imagens value) {
		Session session = getSession();
		session.refresh(value, LockMode.UPGRADE);
		session.delete(value);
		if (log.isDebugEnabled())
			log.debug("deleting document: " + value);
	}

	/** auto generated
	 * @es_generated
	 */
	public void delete(Integer id) {
		Imagens value = getById(id);
		Session session = getSession();
		if (value != null) {
			session.refresh(value, LockMode.UPGRADE);
			session.delete(value);
			if (log.isDebugEnabled())
				log.debug("deleting document: " + value + " by ID:" + id);
		}
	}
}
upload.jsp (inteface que realiza o upload)
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>

<html>
	<head>
		<title></title>
	</head>
	<body>
		<f:view>			
			<h:form enctype="multipart/form-data">
			<h:outputLabel value="Arquivo:" for="arquivo" />
			<t:inputFileUpload id="arquivo"                               
                value="#{testeUpload.arquivo}"
                storage="file"
                required="true"/>
            <h:commandButton action="#{testeUpload.acao}" value="Enviar" />            
			</h:form>			
		</f:view>
	</body>	
</html>
para finalizar faces-config.xml (parte relevante)
<navigation-rule>
  <from-view-id>/testes/upload.jsp</from-view-id>
  <navigation-case>
   <from-outcome>rsUpload</from-outcome>
   <to-view-id>/testes/rsUpload.jsp</to-view-id>
  </navigation-case>
 </navigation-rule>
 <navigation-rule>
ldanielts

Oi,

Essa é a parte que aparece apenas no seu navegador, não é?

O Stack Trace completo (e outras informações importantes) você pode ver no console (onde você iniciou o servidor - seja numa janela de terminal ou a partir de uma IDE) ou no arquivo de log do servidor (este depende de que servidor você instalou e onde o instalou).

Um abraço.

kurama

Ixi, nao consegui achar o log na pasta do tomcat e no console num dá nada o.O, to usando eclipse+exadel…

Anderson_Schmidt

public String acao() { try { Imagens imgAux = new Imagens(); imgAux.setDocumento(arquivo.getBytes()); ImagensDAO imgAux2 = new ImagensDAOImpl(); imgAux2.insert(imgAux); } catch (IOException e) { System.out.println("Erro!"); } return "rsUpload"; }

Vc está desconsiderando a exceção. Ao invés de usar o System.out, use e.printStackTrace();

kurama

beleza, mas como eu faço pra o stack trace ser exibido no html, tipo a saida ser no browser? pq no console nao imprime nada, apenas a inicialização do tomcat.

kurama

seguinte, eu mudei o mapeamento do hibernate e o tipo da minah variavel documento para string, e ao inves de fazer arquivo.getByte() eu usei arquivo.getName() que retorna o nome do arquivo. e tentei inserir no bd e funcionou, nao apresentou esse erro.
por isso ando achando que o problema esta no mapeamento do hibernate para o tipo blob-byte[]
sera que alguem tem alguma solução?

Criado 2 de agosto de 2006
Ultima resposta 2 de ago. de 2006
Respostas 8
Participantes 3