RESOLVIDO:Spring 2.5 + Hibernate3 - AnnotationSessionFactoryBean: No property 'packagesToScan' found

Salve, salve galera do GUJ, tudo bom?

Estou configurando uma aplicação web Spring 2.5.6 + Hibernate3 (annotation based) e estou encontrando um erro bizarro:

org.springframework.beans.InvalidPropertyException: Invalid property ‘packagesToScan’ of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: No property ‘packagesToScan’ found

Porém, abrindo a class AnnotationSessionFactoryBean que está dentro do jar do Spring, o setter está disponível:

	/**
	 * Set whether to use Spring-based scanning for entity classes in the classpath
	 * instead of listing annotated classes explicitly.
	 * <p>Default is none. Specify packages to search for autodetection of your entity
	 * classes in the classpath. This is analogous to Spring's component-scan feature
	 * ({@link org.springframework.context.annotation.ClassPathBeanDefinitionScanner}).
	 */
	public void setPackagesToScan(String[] packagesToScan) {
		this.packagesToScan = packagesToScan;
	}

Alguém tem alguma idéia do que possa ser?

Achei pouquíssimas referencias sobre esse erro no google! E, infelizmente, nenhuma me ajudou… =\

Segue trecho do stacktrace: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: No property 'packagesToScan' found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412) ... 33 more Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: No property 'packagesToScan' found at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:382) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1288) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1249) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472) ... 44 more
E o applicationContext:

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

       <context:annotation-config />

       <context:component-scan base-package="com.xpto.*"/>

	<bean id="dataSource" class="com.mchange.v2.c3p0.DriverManagerDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql://localhost/site" />
		<property name="user" value="user" />
		<property name="password" value="password" />
	</bean>

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

		<property name="dataSource" ref="dataSource" />

		<property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>

        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>

		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.use_sql_comments">true</prop>
				<prop key="hibernate.max_fetch_depth">3</prop>

				<!-- c3p0 -->
				<prop key="hibernate.c3p0.acquireIncrement">2</prop>
				<prop key="hibernate.c3p0.initialPoolSize">5</prop>
				<prop key="hibernate.c3p0.maxPoolSize">10</prop>
				<prop key="hibernate.c3p0.minPoolSize">2</prop>
				<!-- /c3p0 -->
			</props>
		</property>

		<property name="packagesToScan">
			<list>
				<value>com.xpto.domain.model.entity.* </value>
			</list>
		</property>

	</bean>

 	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
		<property name="sessionFactory" ref="sessionFactory" />    
   	</bean>  

	<tx:annotation-driven transaction-manager="transactionManager" />     

    <context:annotation-config />

</beans>

Muito obrigado pela atenção!

No applicationContext na linha:

Tenta trocar por:

No meu applicationContext.xml eu uso:

&lt;bean id="mySessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;

[quote=Caio Vinicius]No applicationContext na linha:

Tenta trocar por:

[/quote]

Olá Caio, bom dia tudo bom?

Muito obrigado pelo retorno!

Bom, eu até cheguei a mudar sim, mas não resolveu meu problema.

Mas na verdade, eu acho que o problema não é que o Spring não está scaneando o pacote, mas sim, que por algum motivo bizarro, ele não está achando a propriedade packagesToScan na classe AnnotationSessionFactoryBean.

Alguma outra dica?

Valeu!

[quote=raf4ever]No meu applicationContext.xml eu uso:

&lt;bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; [/quote]

Faaala @raf4ever, tudo bom?

Valeu pelo retorno!

Então, como estou usando o hibernate3 annotation based, eu pensei em usar o AnnotationSessionFactoryBean (uma especialização da LocalSessionFactoryBean), para não ter que criar arquivos hbm, nem ter que definir classe por classe.

Usando o LocalSessionFactoryBean, sem determinar o packagesToScan, como vc define as entidades?

Mais uma vez, muito obrigado pelo retorno.

Bom dia

Tudo bom rogerio, então tenta mudar a linha onde vc invoca a proprieade packageToScan.

Retire esta linha:

<property name="packagesToScan">  
             <list>  
                 <value>com.xpto.domain.model.entity.* </value>  
            </list>  
</property> 

E adicione esta:

Teste e poste aqui o resultado.

Falou.

Olá Caio, mais uma vez muito obrigado pelo retorno.

Bom, na verdade, estava dessa forma inicialmente. Por via das dúvidas, coloquei novamente, mesmo assim não deu certo, continuava o mesmo erro =(

Mas eu acabei resolvendo de outra forma:

Como eu estava utilizando o hibernate/jpa, mudei a estratégia, e ao invés de usar o org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean, passei a utilizar o org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean. Criei um persistence_unit, e na minha dao generica removi a sessionFactory e criei a propriedade entityManager com a anotação @PersistenceContext.

Conforme descrito aki: http://www.devmedia.com.br/articles/viewcomp.asp?comp=6653

E deu certinho! ^^

Porém agora estou tendo um LazyInitializationException na JSP. O que é estranho, pois já possuo o org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter configurado no web.xml.

Acho que vou abrir uma nova thread sobre isso!

Mesmo assim, muito obrigado pela atenção.