Come iniettare in @FacesValidator con @EJB, @PersistenceContext, @Inject, @Autowired

Come posso iniettare una dipendenza come @EJB , @PersistenceContext , @Inject , @AutoWired , ecc in un @FacesValidator ? Nel mio caso specifico ho bisogno di iniettare un bean gestito da Spring tramite @AutoWired :

 @FacesValidator("emailExistValidator") public class EmailExistValidator implements Validator { @Autowired private UserDao userDao; // ... } 

Tuttavia, non è stato iniettato e rimane null , con conseguente java.lang.NullPointerException . Sembra che @EJB , @PersistenceContext e @Inject non funzionino.

Come faccio ad iniettare una dipendenza dal servizio nel mio validatore in modo che possa accedere al DB?

    @FacesValidator non è gestito dal contenitore di iniezione. Devi renderlo un bean gestito. Usa Spring’s @Component , CDI’s @Named o JSF’s @ManagedBean invece di @FacesValidator per renderlo un bean gestito e quindi idoneo all’iniezione delle dipendenze.

    Ad esempio, assumendo che si desideri utilizzare JSF’s @ManagedBean :

     @ManagedBean @RequestScoped public class EmailExistValidator implements Validator { // ... } 

    Devi anche fare riferimento come bean gestito da #{name} in EL invece che come ID di validatore in stringa hardcoded. Quindi, così

      

    o

      

    invece di

      

    o

      

    Questo è davvero imbarazzante. I ragazzi della JSF hanno confermato questa imbarazzante svista e renderanno @FacesValidator (e @FacesConverter ) un target di iniezione eleggibile nel prossimo JSF 2.2 2.3, vedi anche la specifica JSF numero 763 . Per gli EJB è disponibile una soluzione alternativa acquisendola manualmente da JNDI, vedere anche Ottenere un @ EJB in @FacesConverter e @FacesValidator . Se ti capita di utilizzare l’estensione CDI MyFaces CODI , puoi anche risolverlo mettendo @Advanced annotazione @Advanced sulla class.

    Guarda anche:

    • Iniezione CDI in un FacesConverter
    • Novità di JSF 2.2 – Iniezione

    Aggiornamento : se si utilizza la libreria di utilità JSF OmniFaces , poiché la versione 1.6 aggiunge il supporto trasparente per l’utilizzo di @Inject e @EJB in una class @FacesValidator senza alcuna configurazione o annotazione aggiuntiva. Vedi anche l’esempio di vetrina CDI @FacesValidator .