[quote=grsouza]Rubens, resolvi o problema injetando o SessionFactory na mão, estou usando uma solução mista do Spring AppContext.xml com o Spring javaConfig
meus Beans/Controllers/Repository to mapenando com annotations. O DataSource, o Hibernateproperties e o SessionFactory to mapenado no com o xml.
…
SpringAccess é uma classe static para retorno dos beans e mapeamentos feitos.[/quote]Olá grsouza;
Tambem estou recebendo o maldito “IllegalArgumentException: ‘sessionFactory’ or ‘hibernateTemplate’ is required” mesmo tendo configurado o sessionFactory pro DAO corretamente.
Mas estou tendo problemas pra implementar uma solução parecida com a sua. Como vc utiliza seu SpringAccess ? É algo tipo @Component @Scope e a propriedade sessionFactory com @Autowired; ou é com new ClassPathXmlApplicationContext ?
Abaixo estão disponíveis os códigos das 2 soluções que tentei.
Com a implementação1 que fiz do SpringXmlAccess; o início do contexto da aplicação está caindo em loop infinito :shock:
E com a implementação2 (SpringAnnotationAccess) está dando aquele problema: “Unsatisfied dependency of type [interface org.hibernate.SessionFactory]: expected at least 1 matching bean”. Já tentei colocar o setSessionFactory no construtor do AbstractDAO assim como vc fez; e tambem coloca-lo com @PostConstruct no SiteRemotoHibernateDAOImpl.
applicationContext-persistence.xml:[code]<?xml version="1.0" encoding="UTF-8"?>
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@************:1521:xe"/>
<property name="username" value="********"/>
<property name="password" value="***********"/>
</bean>
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.jdbc.wrap_result_sets">false</prop>
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>
</props>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource1"/>
</property>
<property name="hibernateProperties">
<ref bean="hibernateProperties" />
</property>
<property name="packagesToScan" value="com.altec.bsbr.app.gac.entity"/>
</bean>
<bean id="siteRemotoHibernateDAO" class="com.altec.bsbr.app.gac.dao.impl.SiteRemotoHibernateDAOImpl" >
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
[/code]Exceção antes das soluções abaixo:[quote]org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'siteRemotoHibernateDAOImpl' defined in file [C:\Arquivos de programas\IBM\WebSphere\AppServer1\profiles\AppSrv01\installedApps\O360UDI17Node01Cell\GAC.ear\gac.war\WEB-INF\classes\com\altec\bsbr\app\gac\dao\impl\SiteRemotoHibernateDAOImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:117)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
... 108 more[/quote]
SiteRemotoHibernateDaoImpl:[code]@Repository
public class SiteRemotoHibernateDAOImpl extends AbstractHibernateDAO<SiteRemoto, Long> implements
SiteRemotoHibernateDAO {
/**
@Autowired
SessionFactory sessionFactory;
@PostConstruct
public void init() {
setSessionFactory(sessionFactory);
}
*/
public SiteRemotoHibernateDAOImpl() {
super();
}[/code]AbstractHibernateDAO:[code]public abstract class AbstractHibernateDAO<ENTITY extends EntityBean, PK extends Serializable>
extends HibernateDaoSupport implements AbstractDAOPublic<ENTITY, PK>, PropertySelector {
private Class<ENTITY> persistentClass;
@Autowired
private SpringAnnotationAccess springAnnotationAccess;
public void setSpringAnnotationAccess(SpringAnnotationAccess springAnnotationAccess) {
this.springAnnotationAccess = springAnnotationAccess;
}
@SuppressWarnings("unchecked")
public AbstractHibernateDAO() {
try {
persistentClass = (Class<ENTITY>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
this.setSessionFactory(springAnnotationAccess.getSessionFactory());
// this.setSessionFactory(SpringXmlAccess.getSessionFactory()); //loop-infinito
}
catch (Exception e) {
LOGGER.error(ExceptionUtils.getStackTrace(e));
}
finally {
}
}[/code]#############
IMPLEMENTAÇÃO-2
#############
PROBLEMA: Unsatisfied dependency of type [interface org.hibernate.SessionFactory]: expected at least 1 matching bean
SpringAnnotationAccess.java:[code]@Component
@Scope(“singleton”)
public final class SpringAnnotationAccess {
@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
*
*/
public SessionFactory getTheSessionFactory() {
return getSessionFactory();
}
}[/code]#############
IMPLEMENTAÇÃO-1
#############
PROBLEMA: loop infinito na inicialização do contexto (start do servidor websphere)
SpringXmlAccess.java:[code]public final class SpringXmlAccess {
public static SessionFactory getSessionFactory() {
ApplicationContext appCtx = new ClassPathXmlApplicationContext(
new String[] { "applicationContext-persistence.xml" });
SessionFactory sessionFactory = (SessionFactory) appCtx.getBean("sessionFactory", SessionFactory.class);
return sessionFactory;
}
}[/code]