2012-10-26 9 views
6

Ho la seguente struttura dei file di contesto a molla (-> sta per 'include'):Come iniettare un fagiolo solo quando esiste

A1.xml -> B.xml & C.xml 
A2.xml -> B.xml 

C.xml definisce un fagiolo c

B.xml definisce un fagiolo b con una dipendenza su c

Ovviamente questo non riesce per A2, perché non c'è c definito nel contesto A2.

Come posso specificare qualcosa di simile: se avete c nel contesto iniettarlo in b altrimenti solo iniettare null?

ho guardato in primavera EL ma

<property name="b" ref="#{ @c?:null}" /> 

mi ha dato un NoSuchBeanDefinitionException per un nome che sembrava essere il valore di b.toString()!?

Btw: So già che questa cosa è disordinata come l'inferno e dovrebbe essere ripulita il più velocemente possibile.

risposta

16

L'oggetto #root dell'espressione SpEL è un BeanExpressionContext, è possibile richiamare il metodo getObject() in tale contesto; restituisce null se il fagiolo non è dichiarato ...

<property name="bar" value="#{getObject('bar')}" /> 

Nota: si utilizza value non ref perché restituisce il fagiolo, non la definizione di fagioli.

Ecco il codice da getObject()

public Object getObject(String key) { 
    if (this.beanFactory.containsBean(key)) { 
     return this.beanFactory.getBean(key); 
    } 
    else if (this.scope != null){ 
     return this.scope.resolveContextualObject(key); 
    } 
    else { 
     return null; 
    } 
} 
6

sono abbastanza d'accordo con la pulizia del XML :-)

Se si utilizza l'iniezione a base di annotazione, si potrebbe provare this trick

@Autowired(required=false) 

Non sono sicuro se questo funzionerà nella vostra situazione , ma vale la pena provare.

+0

sono costretto a xml: - / –