Estou iniciando no Spring e posso estar cometendo alguma falha "catastrófica"...
Seguinte tenho minha classe GenericHibernateDAO implements DAO que contem os metodos genericos de persistencia com Hibernate.
Tenho um Controller que possui um atributo airportDAO do tipo DAO (Interface implementada pelo GenericHibernateDAO)
No construtor do meu Controller eu recebo a Sessionfactory e dentro do construtor do controller eu faço:
airportDAO = new GenericHibernateDAO(sessionFactory);
Recebo o seguinte erro:
.beans.factory.BeanCreationException: Error creating bean with name 'genericHibernateDAO' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.apress.expertspringmvc.flight.dao.hibernate.GenericHibernateDAO]: Constructor threw exception; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Cara, tem alguma coisa estranha no construtor do GenericHibernateDAO. Pq tu criou ele?
Pq não usar ‘set’?
E esse último código que mandaste, pq o construtor do AirportController recebe uma SessionFactory?
rafaelunp
fabiofalci:
Cara, tem alguma coisa estranha no construtor do GenericHibernateDAO. Pq tu criou ele?
Pq não usar ‘set’?
E esse último código que mandaste, pq o construtor do AirportController recebe uma SessionFactory?
Pois é fabio, ele possui a SF porque dentro dele eu instanciava o DAO passando o SF. Sendo que removendo de dentro do construtor, realmente nao faz sentido haver SF.
Contudo não gostaria de fazer isso via setter devido. Através do construtor, sendo obrigatório a passagem do SF, não teria como ocorrer um nullpointer. Através do setter o programador pode esquecer de invocar este metodo e nao passar a SF…
fabiofalci
O programador esquece, o Spring não!
Usar o construtor é ok, o caso ali é aquele código dentro do construtor
Essa primeira linha, não está estourando ali? Para que vc precisa disso?
rafaelunp
Pra não precisar ficar dando cast no genericHibernateDao nem ficar passando a entity como parametro. No caso a classe ficou assim:
publicclassGenericHibernateDAO<T,IDextendsSerializable>implementsDAO<T,ID>{privatefinalClass<T>persistentClass;privatefinalSessionFactorysessionFactory;publicGenericHibernateDAO(SessionFactorysessionFactory){this.persistentClass=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];this.sessionFactory=sessionFactory;}protectedSessiongetSession(){if(sessionFactory==null){thrownewIllegalStateException("A SessionFactory não foi informada ou está nula.");}returnsessionFactory.openSession();}publicClass<T>getPersistentClass(){returnpersistentClass;}publicvoidflush(){getSession().flush();}publicvoidclear(){getSession().clear();}/** * Use this inside subclasses as a convenience method. */protectedList<T>findByCriteria(Criterion...criterion){Criteriacrit=getSession().createCriteria(getPersistentClass());for(Criterionc:criterion){crit.add(c);}returncrit.list();}protectedQueryquery(Stringhql)throwsDAOException{returngetSession().createQuery(hql);}/* Implementacoes da Interface DAO */@OverridepublicTcreate(Tentity){getSession().saveOrUpdate(entity);returnentity;}@OverridepublicTupdate(Tentity){getSession().saveOrUpdate(entity);returnentity;}@OverridepublicTdelete(Tentity){getSession().delete(entity);returnentity;}@OverridepublicTfindById(IDid){return(T)getSession().load(getPersistentClass(),id);}@OverridepublicList<T>findAll(){returnfindByCriteria();}@OverridepublicList<T>findByExample(TexampleInstance,String[]excludeProperty){Criteriacrit=getSession().createCriteria(getPersistentClass());Exampleexample=Example.create(exampleInstance);for(Stringexclude:excludeProperty){example.excludeProperty(exclude);}crit.add(example);returncrit.list();}
}
fabiofalci
Entendi, blz.
Fizemos uma solução não tão automatizada assim, algo assim:
public AirpotHibernateDAO() {
super(Airpot.class);
}
A ideia é a mesma, mas não pega automático do generics, mas sim passa-se explicitamente.
No caso da exception, ele está reclamando desse cast aqui