Utilisation d'attribut injecté avec CDI dans le constructeur d'un objet injecté lui même avec CDI avec @PostConstruct
Problème
Lors d'un test d'intégration je me suis retrouvé avec un nullpointer lors de l'exécution de celui-ci.Le nullpointer venait du fait que CDI n'avais pas achevé son injection dans l'attribut que j'utilisais et qui était donc null lors de son utilisation.
Imaginons une classe 'Developpeur' et dans cette classe un attribut qui serait une classe 'LieuDeTravail'.
La classe LieuDeTravail:
public class LieuDeTravail { private String ville; public Travail(){ super(); } public String getVille(){ return ville; } public String setVille(String ville){ this.ville = ville; } }
La classe Developpeur:
public class Developpeur { @Inject private transient LieuDeTravail lieu; private String ville; public Developpeur(){ super(); ville = lieu.getVille(); } ... }--> Le traitement va planter a l'instruction lieu.getVille(); car lieu sera null.
Solution
Utiliser l'annotation @PostConstruct :
public class Developpeur { @Inject private transient LieuDeTravail lieu; private String ville; public Developpeur(){ super(); } ... @PostConstruct private void chargerVille() { ville = lieu.getVille(); } }Et voilà, le tour est joué !
Commentaires
Enregistrer un commentaire