mercredi 9 avril 2014

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é !