2010-09-27 3 views
6

Je voudrais utiliser l'annotation de printemps @Repository pour éviter d'ajouter un bean dans context.xml. J'utilise l'intégration de ibatis, donc ma classe référentiel ressemble à ceInjection de la propriété dérivée pour le bean @Repository sans @Autowired dans la super classe

@Repository("userDao") 
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

SqlMapClientDaoSupport (classe de bibliothèque de printemps) a dernière méthode pour la mise en propriété requise qui ne sont pas annotées avec @Autowired ou @Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) { 
    if (!this.externalTemplate) { 
     this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient); 
    } 
} 

Le bean SqlMapClient est défini au printemps context.xml. Si le haricot userDao est défini en XML, il fonctionne très bien, mais quand je mets l'annotation @Repository et supprimer la déclaration de haricots je reçois l'exception suivante

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required 

Une solution peut être d'ajouter une nouvelle méthode comme

@Aitowired 
injectSqlMapClient(SqlMapClient sqlMapClient) { 
    setSqlMapClient(sqlMapClient); 
} 

mais il semble moche

Y a-t-il un autre moyen d'injecter la propriété sans avoir défini?

+1

Je pense que votre solution de contournement est assez décente. – Bozho

Répondre

3

Que diriez-vous d'introduire une superclasse intermédiaire?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

    @Autowired 
    injectSqlMapClient(SqlMapClient sqlMapClient) { 
     setSqlMapClient(sqlMapClient); 
    } 
} 

puis

@Repository("userDao") 
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

Oui, il est l'abus de l'héritage, mais pas pire que le SqlMapClientDaoSupport existant, et si vous êtes désespéré pour éviter le crochet d'injection dans la classe DAO lui-même, je peux Je ne pense pas à un meilleur moyen.

+0

Je pensais aussi avoir une telle classe (j'ai plus d'un DAO, donc c'est mieux que d'avoir injectSqlMapClient dans chaque DAO), mais ça me semble moche parce que je dois introduire une nouvelle classe dont je n'ai pas vraiment besoin - J'enlève une chose (définitions de bean) mais en obtiens une autre (nouvelle classe). Mais de toute façon, merci pour vos pensées –

Questions connexes