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

pessoal estou tendo o seguinte erro

[code]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)
[/code]

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.

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.

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.

[quote=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.[/quote]

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)

[code]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;
}

}[/code]

TesteUploadBean.java (managed bean)

[code]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";
}	

}[/code]

ImagensDAOImpl.java (classe gerada automaticamente, faz as funções de insert, delete, etc)

[code]/* 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);
	}
}

}[/code]

upload.jsp (inteface que realiza o upload)

[code]<%@ 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> [/code]

para finalizar faces-config.xml (parte relevante)

 &lt;navigation-rule&gt;
  &lt;from-view-id&gt;/testes/upload.jsp&lt;/from-view-id&gt;
  &lt;navigation-case&gt;
   &lt;from-outcome&gt;rsUpload&lt;/from-outcome&gt;
   &lt;to-view-id&gt;/testes/rsUpload.jsp&lt;/to-view-id&gt;
  &lt;/navigation-case&gt;
 &lt;/navigation-rule&gt;
 &lt;navigation-rule&gt;

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.

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

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();

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.

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?