Injection de dépendance et constructeur
Salut à tous,
J'ai un bean managé A en session. J'ai un bean managé B ayant un attribut du type du bean A :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <managed-bean>
<managed-bean-name>monBeanA</managed-bean-name>
<managed-bean-class>com.test.BeanA</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>monBeanB</managed-bean-name>
<managed-bean-class>com.test.BeanB</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>beanA</property-name>
<value>#{monBeanA}</value>
</managed-property>
</managed-bean> |
A chaque requête, je dois afficher le résultat d'une requête SQL faite dans le bean B. Cette requête a besoin de plusieurs paramètres dont les valeurs sont contenues dans le bean A.
J'ai d'abord essayé de récupérer les attributs de mon bean A dans le constructeur de mon bean B :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class BeanB {
private BeanA beanA;
private List maListe; //la liste à afficher (celle qui contient les résultats de ma requête SQL
public BeanB() {
maListe = resultatSQL(beanA.attributA, beanA.attributB);
}
// le getteur et setteur de beanA et de maListe
private List resultatSQL(param1, param2) {
// renvoie le résultat de ma requête SQL dans un objet List
}
} |
Mais je me fais insulter car l'attribut beanA est null, puisqu'il n'a pas encore été initialisé. Il sera initialisé après l'appel au constructeur de la classe B.
J'ai contourné le problème en appelant la méthode resultatSQL(), non pas dans le constructeur, mais dans le getteur de l'attribut maListe de la classe BeanB. Mais d'autres problèmes se posent :
- C'est moche :)
- Je n'ai pas accès aux attributs de maListe (la taille par exemple) tant que getMaListe() n'est pas appelé (avec #{monBeanB.maListe} dans une JSP)
Existe-t-il un moyen de forcer l'injection de dépendance avant l'appel du constructeur de la classe BeanB (sans devoir installer un framework type Spring ou Seam :roll:) ? Ou peut-être qu'il s'agit d'un problème de conception ?
Merci !