Chcę pobrać komponent bean z metody producenta w celu odczytania jego właściwości. W niektórych scenariuszach fasola jest fasolką EJB Singleton
.injectionPoint.getBean() zwraca null, jeśli komponent bean jest komponentem EJB w języku Java EE 7 (CDI 1.1)
Uprościliśmy kod, aby skoncentrować się na problemie.
mój prosty kwalifikator:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}
Proste producent:
@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 wyjście:
Info: ip = [BackedAnnotatedField] @Inject @InjectMe prywatny com.test.ejb.SimpleSingleton.injectMe,
bean=null
Kiedy zmienić Singleton
fasola szparagowa do CDI
wszystko działa w porządku (ip.getBean()
powraca not null). Pracował również w Java EE 6
, nawet z ziarnami Singleton
, ale nie ma go w Java EE 7
. Używam serwera aplikacji Glassfish 4.
Czy to zachowanie jest określone gdzieś?
Brzmi jak błąd glassfish. –
@JohnAment: Nie sądzę, to samo zachowanie dla WildFly. Nie można jeszcze odpowiedzieć na pytanie, ale możliwe przyczyny to: 1) zmiana zachowania modułu Disc Beans (domyślnie: "adnotowane"); 2) wstrzykiwanie (niezwiązanego z kontekstem) ciągu klasy; 3) bez zadeklarowanego zakresu innego niż 'Zależny' –
Jeśli wywołasz metodę' ip.getMember(). GetDeclaringClass() ', otrzymasz dla obu przypadków FQCN, jest to również używane jako przykład w dokumencie InjectionPoint API i Widziałem to w przykładzie Deltaspike jako połączenie uzupełniające po 'bean' jest' null'. –