2014-10-20 40 views
7

Używanie Wildfly 8.1 Mam kilka ziaren, które próbuję wprowadzić kilka EJB do siebie. Powiedzmy, że mam 3 ziarna:Dlaczego fasolki bezstanowe są traktowane jako pseudo-zakres i nie mogą mieć zależności cyklicznych?

@Stateless 
public class A{ 
    @Inject 
    private B b; 
} 

@Stateless 
public class B{ 
    @Inject 
    private C c; 
} 

@Stateless 
public class C{ 
    @Inject 
    private A a; 
} 

Oczywiście mam zależność cykliczną. Według specyfikacji:

Pojemnik jest wymagane do obsługi circularities na wykresie fasoli zależności, gdzie co najmniej jeden fasoli udział w każdej zamkniętego łańcucha zależności ma normalny zakres

Uruchamianie powyższy kod wynik pojemnik błędu w postaci:

org.jboss.weld.exceptions.DeploymentException: wspawania 001443: Pseudo zawężona bean okrągłe zależności. Ścieżka zależności:

-Session bean [klasa A z kwalifikacjami [@Default @ Any]; Lokalne interfejsy są [A] BackedAnnotatedField] @Inject prywatny B,

[..]

tutaj moje pytanie: jaki jest zakres @Stateless fasoli? Czy to domyślnie @Dependent? A przede wszystkim, w jaki sposób mogę włączyć zależności cykliczne między bezstanowymi komponentami bean sesji?

Przepraszam, jeśli pytanie jest zbyt banalne. Będę wdzięczny za wszelkie dobre dalsze źródła lektur, które wyjaśnią prezentowane zachowanie. Z góry dziękuję.

ZAKTUALIZOWANE Ok. Znalazłem obejście. Użyłem adnotacji @EJB zamiast @Inject, ale to nie wyjaśnia dziwnego zachowania @Inject. Pytanie pozostaje otwarte, ale Mika zasugerowała, że ​​może to być nierozwiązany problem zarówno w specyfikacji CDI, jak i Weld RI.

+0

nie mam odpowiedzi, ale nie jest to banalne pytanie. Dyskutowano o tym między członkami CDI EG. Spójrz na CDI spec jira, powinien pojawić się problem dotyczący tego tematu. –

+0

@MikeBraun czy mógłbyś podać link do problemu jiry? Szukałem, ale nie jestem pewien, czy patrzę na właściwy. – iku

+0

to CDI-414, zobacz https://issues.jboss.org/browse/CDI-414 –

Odpowiedz

3

@Stateless nie ma zasięgu i nie ma żadnego związku z jakimkolwiek zakresem. Twoja fasola kończy się jako @Dependent, ponieważ nie masz adnotacji żadnego innego zakresu na twoich ziarnach.

Musisz podać im normalny zakres - @RequestScoped lub @ApplicationScoped, jednak nie jestem pewien, czy ma to sens w twoim przypadku.

+0

Twoje rozwiązanie będzie ważne tylko wtedy, gdy zarządzano nim w warstwie internetowej. Ponieważ jest to komponent EJB, jest raczej błędem w implementacji CDI. – iku

+0

Nie zgadzam się z tym. Scoping Stateless nie ma tu sensu i myślę, że nawet by nie zadziałał. Tylko ziarna stanowe mogą mieć zakresy. Faktem jest, że CDI nie ma naprawdę przekonującej odpowiedzi na zjawisko "@Stateless". Bezpaństwowy komponent bean bardziej przypomina punkt końcowy nasłuchujący komunikatów niż zwykły komponent bean. Właśnie dlatego samo wstrzykiwanie i cykliczne zależności nie stanowią problemu. Bezpaństwowy serwer proxy jest bardziej podobny do adresu URL. Kiedy następuje wywołanie metody, jest ono wysyłane do dowolnego komponentu bean tego typu (nowej instancji, jednej z puli, zawsze tej samej, ...). Żądanie scoped byłoby tutaj całkowicie błędne. –

1

To nie odpowiada na całe pytanie, ale było to pierwsze trafienie w google, gdy wyszukiwałem wyjątki zależności cyklicznych. Mając nadzieję, że pomoże to innym programistom znalezienie szybszej odpowiedzi, tutaj jest moje rozwiązanie.

Kod, który powoduje okrągły wyjątek Zależność:

class A{ 
    @Inject B b; 
    public void foo(){ 
     b.bar(); 
    } 
    public void quux(){ 
     //some code 
    } 
} 
class B{ 
    @Inject A a; 
    public void bar(){ 
     //some code 
    } 
    public void baz(){ 
     a.quux(); 
    } 
} 

Rozwiązanie Aby rozwiązać ten problem jest użycie javax.enterprise.inject.Instance

class A{ 
    @Inject B b; 
    public void foo(){ 
     b.bar(); 
    } 
    public void quux(){ 
     //some code 
    } 
} 
class B{ 
    @Inject Instance<A> a; 
    public void bar(){ 
     //some code 
    } 
    public void baz(){ 
     a.get().quux(); 
    } 
}