[Javalist] Spring meghal ha interfeszt implementalok (?)
Gábor Garami
gabor.garami at hron.me
2012. Aug. 19., V, 23:40:47 CEST
Na, ilyet meg nem pipaltam. Elvben minden standard javas, sot,
allitolag ajanlas az, ami nekem nem megy... meg ilyet...
Szoval, adott ket rovid szosszenet:
public interface IFacade<T extends IEntity> {
//@Transactional
public void create(T entity);
//@Transactional
public void update(T entity);
//@Transactional
public void remove(T entity);
public T find(Object id);
public List<T> findAll();
public List<T> findRange(int[] range);
public int count();
}
public abstract class AbstractFacade<T extends IEntity> implements IFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
/**
* Stores new entity into the database
* @param entity the new entity. Should <em>not</em> be persisted
*/
@Transactional
@Override
public void create(T entity) {
if(!getEntityManager().contains(entity)) {
getEntityManager().persist(entity);
getEntityManager().flush();
}
}
/**
* Updates entity in the database
* @param entity the subject entity. Must <em>be</em> persisted
*/
@Override
@Transactional
public void update(T entity) {
getEntityManager().merge(entity);
getEntityManager().flush();
}
/**
* Removes entity from the database
* @param entity the subject entity. Must <em>be</em> persisted
*/
@Override
@Transactional
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
getEntityManager().flush();
}
// Es igy tovabb, az osszes metodushoz van megfelelo implementacio
}
A problema a kovetkezo. Ha az AbstractFacade fenti definiciojat hasznalom:
Caused by:
org.springframework.beans.factory.BeanCreationException: Could not
autowire field: private me.hron.springblog.dao.ArticleFacade
me.hron.springblog.controller.ArticleContoroller.articleDao; nested
exception is java.lang.IllegalArgumentException: Can not set
me.hron.springblog.dao.ArticleFacade field
me.hron.springblog.controller.ArticleContoroller.articleDao to
$Proxy27
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
.... and so on...
Ha viszont nem implementalom az IFacade interfeszt a fenti modon
(vagyis kiesik az implements IFacade<T>) akkor gyonyoruen fut a progi.
A tesztek mindket esetben lefutnak, tehat magad a kesz, implementalt
dao objektumot nem befolyasolja az IFacade lete vagy nem lete, egyedul
a kontrollerekbe torteno injekciozas, az, ami megdoglik ilyenkor.
Nem tudom, hogy ez-e a baj, de olyan erzesem van, mintha az IFacade
implementaciojanak tenye tul bonyolult lenne a kis egyszeru szoszke
lelkenek, es nem tudna feloldani, hogy mi a pocsot akarok en ottan.
Pedig hat azert ez annyira nem egy ertelmetlen dolog.
Az app mukodik enelkul a szerkezet nelkul is, szoval en biztos nem
fogok a konyhakes utan nyulkalni szivbokdoses celjaval, ha ez igy nem
fog osszejonni, de furdalja a lelkemet, hogy ugyan mi kivetnivalot
talal ebben? Esetleg en rontok el valamit, es - noch dazu - valami
nonszensz dolgot eroltetek?
Garami Gábor
E-mail: gabor.garami at hron.me
Tel: +36 20 235 9621
MSN: hrgy at vipmail.hu
Skype: hron84
További információk a(z) Javalist levelezőlistáról