Voglio ottenere bean dal metodo produttore per poterne leggere le proprietà. In alcuni scenari il bean è un bean EJB Singleton
.injectionPoint.getBean() restituisce null se bean è un bean EJB in Java EE 7 (CDI 1.1)
Ho semplificato il mio codice per concentrarsi sul problema.
mio semplice qualificazione:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}
semplice produttore:
@Dependent
public class SimpleProducer {
@Produces
@InjectMe
public String getInjectMe(InjectionPoint ip) {
// ip.getBean() returns null for some reason
return "ip=" + ip + ", bean=" + ip.getBean();
}
}
EJB (Singleton):
@Singleton
@Startup
public class SimpleSingleton {
@Inject
@InjectMe
private String injectMe;
@PostConstruct
public void init() {
System.out.println(injectMe);
}
}
Console uscita:
Info: ip = [BackedAnnotatedField] @Inject @InjectMe com.test.ejb.SimpleSingleton.injectMe privato,
bean=null
Quando cambio Singleton
chicco alla CDI
fagioli tutto funziona bene (ip.getBean()
rendimenti non nulli). Ha funzionato anche in Java EE 6
anche con il bean Singleton
ma non in Java EE 7
. Sto usando il server di applicazioni Glassfish 4.
Questo comportamento è specificato da qualche parte?
Sembra un insetto di pesce cristallo. –
@JohnAment: Non pensarlo, lo stesso comportamento per WildFly. Non posso ancora rispondere alla domanda, ma i possibili motivi potrebbero essere: 1) modifica del comportamento del modulo di scoperta dei bean (default: 'annotated'); 2) iniettare una stringa di classe (non contestuale); 3) non avendo scope dichiarati diverso da 'Dependent' –
Se si chiama' ip.getMember(). GetDeclaringClass() ', si otterrà per entrambi i casi l'FQCN, questo è anche usato come esempio nel doc di InjectionPoint API e L'ho visto in un esempio di Deltaspike come una chiamata successiva dopo che 'bean' è' null'. –