[Javalist] Spring meghal ha interfeszt implementalok (?)

Böszörményi Péter zmblevlist at gmail.com
2012. Aug. 20., H, 12:00:32 CEST


Megneztem, a baj egyszeru. Spring alapbol jdk proxyt akar hasznalni,  
ahhoz, hogy a beanhoz tranzakcionalis viselkedest rendelejen. A jdk proxy  
viszont csak interfacekkel mukodik, a kod viszont konkret osztalyt var,  
ezen hasal ez az egesz. Megoldasok: az ArticleFactoryhoz keszites egy  
interfacet, vagy a tx:annotation-driven taget kiegeszited egy  
proxy-target-class="true" attributummal, es berakod a cglibet fuggosegnek,  
ha meg nincs.

On Sun, 19 Aug 2012 23:40:47 +0200, Gábor Garami <gabor.garami at hron.me>  
wrote:

> 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
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist


-- 
Üdvözlettel,
Böszörményi Péter


További információk a(z) Javalist levelezőlistáról