[RESOLVIDO] Problema com VRaptor: org.springframework.beans.factory.BeanCreationException

Externalizei algumas classes em comum entre vários projetos, em um projeto separado.
Após isso, estou recebendo essa exceção do VRaptor. Preciso fazer algum mapeamento adicional?

[quote]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘br.com.cauirs.nome.infra.CriadorDeSessionFactory’: FactoryBean threw exception on object creation; nested exception is java.lang.NoClassDefFoundError: Lbr/com/cauirs/tipos/Dinheiro;
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:150)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1387)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:244)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:771)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:691)
… 64 more
Caused by: java.lang.NoClassDefFoundError: Lbr/com/cauirs/tipos/Dinheiro;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2308)
at java.lang.Class.getDeclaredFields(Class.java:1760)
at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredFieldProperties(JavaXClass.java:102)
at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredProperties(JavaXClass.java:126)
at org.hibernate.annotations.common.reflection.java.JavaXClass.getDeclaredProperties(JavaXClass.java:121)
at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:259)
at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:223)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:686)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3977)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3931)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1368)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1826)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.abrirSessionFactory(CriadorDeSessionFactory.java:35)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.getInstance(CriadorDeSessionFactory.java:47)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.getInstance(CriadorDeSessionFactory.java:1)
at br.com.caelum.vraptor.ioc.spring.ComponentFactoryBean.getObject(ComponentFactoryBean.java:43)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:143)
… 73 more
Caused by: java.lang.ClassNotFoundException: br.com.cauirs.tipos.Dinheiro
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
… 91 more[/quote]

Class CriadorDeSessionFactory

[code]@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory
{

private Map<Tenant, SessionFactory> conexoes = new HashMap<Tenant, SessionFactory>();

private SessionFactory abrirSessionFactory()
{
	SessionFactory conexao;
	Configuration configuracao = new Configuration();
	
	String arquivoConfiguracao = new StringBuilder().append("hibernate").append(".cfg.xml").toString();
	configuracao.configure(arquivoConfiguracao); 

	configuracao.addAnnotatedClass(Venda.class); //ERRO OCORRE NESSA LINHA
	
	conexao = configuracao.buildSessionFactory();
	
	return conexao;
}

@Override
public SessionFactory getInstance() 
{
	SessionFactory conexao = conexoes.get("hibernate");
	
	if( conexao == null )
	{
		conexao = abrirSessionFactory();
	}
	
	return conexao;
}  

}[/code]

Classe Venda:

[code]@Entity
@Table(name=“venda”)
@XStreamAlias(“venda”)
public class Venda
{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@Embedded
private Dinheiro valorItens = new Dinheiro();
    .....

}[/code]

Observações:

  1. O projeto está referenciado no Eclipse, tanto é que consigo usar a classe no código.
  2. Se copio a classe Dinheiro para dentro do projeto, funciona.

O padrão JPA diz que somente as classes que estão no seu projeto podem ser usadas na persistência. Ou seja, se está em um jar separado não funciona. Já com o Hibernate puro não sei como isso funciona, mas não creio que o comportamento seja diferente.

o jar em que está a classe Dinheiro está no WEB-INF/lib ou direto no lib do servidor?

garcia-jj

Faz sentido. Legal saber disto.

Lucas Cavalcanti

Havia tentado linkando para um jar externo dentro do outro projeto e também apenas referenciando o projeto. (Para não precisar exportar o jar toda alteração).
Exportei o jar e coloquei dentro da pasta WEB-INF/lib e esse erro não ocorre mais.

Outro detalhe, havia acontecido o erro abaixo com as libs que peguei por padrão no projeto do VRaptor.
Troquei a lib ejb3-persistence.jar pela persistence.jar e o erro desapareceu.

[quote]Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1912)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3977)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3931)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1368)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1826)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.abrirSessionFactory(CriadorDeSessionFactory.java:35)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.getInstance(CriadorDeSessionFactory.java:47)
at br.com.cauirs.nome.infra.CriadorDeSessionFactory.getInstance(CriadorDeSessionFactory.java:1)
at br.com.caelum.vraptor.ioc.spring.ComponentFactoryBean.getObject(ComponentFactoryBean.java:43)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:143)
… 73 more[/quote]

Valeu a força vou continuar os testes aqui. Quando ‘trancar’ de novo venho pedir ajuda :roll:


Esse método é o JPA2. Talvez você estivesse com o jar do JPA1.

Esse método é o JPA2. Talvez você estivesse com o jar do JPA1.

Eu estava com o Jar ejb3-persistence-1.0.1.GA, tentei também trocar pelo ejb3-persistence-1.0.2.GA.

1.0.2-GA ainda é JPA1

Ok. Então foi isso. Obrigado.