[Javalist] Spring meghal ha interfeszt implementalok (?)

Gábor Garami gabor.garami at hron.me
2012. Aug. 21., K, 06:32:57 CEST


Vegul egy egyszeru (viszont szerintem csunya) megoldas lett a vege.

Atgondoltam, es rajottem, hogy itt valojaban en vagyok a bolond, hogy
ott az interfesz, de a DI soran megis konkret osztalyokkal
dolgoztatok.

Ezert atraktam ilyenre a definciot:

@Autowired
private IFacade<Article> articleFacade;

Ez mind szep es jo, am a Spring ezen a ponton mintha nem ismerne a
generikusokat. Ugyanis volt mersze azt allitani, hogy a DI soran ket
lehetseges jeloltet talalt: az UserFacade-t (IFacade<User>) es az
ArticleFacade-t (IFacade<Article>). Valojaban ezek nyilvan nem ugyanaz
a tipusok, am ezzel egyutt nem volt hajlando betolteni oket.
Igy vegulis az alabbi lett a definicio:

@Autowired
@Qualifier("articleFacade")
private IFacade<Article> articleFacade

Vagyis, meghinteltem neki, hogy mit szeretnek ott latni. Ellenben ezt
en nem tartom szep megoldasnak. Gondoljatok, hogy ertemes lenne valami
mas definiciot keresni? Vagy ez igy egyebkent normalis?

Az az egesszel a problemam, hogy a Spring ugye folyamatosan tolja a
DRY elvet. En ezt pont ott latnam megserulni, ha minden egyes nyuves
kis DAO kodba ugyanazt a 4-5 metodust kellene bepasztaznom, majd
atirnom benne a tipusokat. Hat a Sun is erre teremtette a
generikusokat, nem? Viszont emiatt nem orulnek egy ilyen megoldasnak
sem:

public interface IArticleFacade extends IFacade<Article> {}
public class ArticleFacade extends AbstractFacade<Article> implements
IArticleFacade {}

mert feleslegesnek erzem. Hanyszor, es hanyfelekeppen mondjam el, hogy
ez egy olyan Facade, ami Article-kkel dolgozik? Kicsit mintha ovodaban
lennek...
Nyilvan persze a ket megfogalmazas kicsit mas, mert ha az
ArticleFacade-ben volna valami specifikus dolog, akkor azt fel kellene
vezetni az IArticleFacade-ba, hogy tipusegyezes legyen, azonban nincs,
es nem is tervezek specifikusat.

De lehet, hogy rosszul gondolom, javitsatok ki, ha tevedek. Szerintem
a generikusok egy olyan nyelvi feature, amit pont erre a feladatra
teremtettek.


Garami Gábor
E-mail: gabor.garami at hron.me
Tel: +36 20 235 9621
MSN: hrgy at vipmail.hu
Skype: hron84


2012/8/21 Gábor Garami <gabor.garami at hron.me>:
> A második megoldást fogom kipróbálni az elsőnek ebben a kontextusban nem
> lenne értelme, csak az interface kulcsszó miatt nem fogok szemetet gyártani.
> A cglib már nagyon rég benn van.
>
> Garami Gábor
> gabor.garami at hron.me
> Skype: hron84
>
>
> Tel: +36 20 235 9621
>
> Sent from my T-Mobile G2
> Ezt a levelet telefonról adták fel, ékezethibákat tartalmazhat.
>
> 2012.08.20. 12:00, "Böszörményi Péter" <zmblevlist at gmail.com> ezt írta:
>
>> 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
>> _______________________________________________
>> Javalist mailing list
>> Javalist at lists.javaforum.hu
>> http://lists.javaforum.hu/mailman/listinfo/javalist


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