2012-01-27 19 views
11

Oto sytuacja.WELD-001408 Niezadowolone zależności podczas wstrzykiwania modułów EJB implementujących interfejsy

Mam następujące interfejsy:

public interface Parent { } 
public interface ChildOne extends Parent { } 
public interface ChildTwo extends Parent { } 

i 2 EJB:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

a także to CDI Fasola:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

starając się wdrożyć ten na Glassfish 3.1 Otrzymuję następujący wyjątek:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) 

Gdy oba komponenty EJB implementują interfejs Parent, wyjątek jest taki sam.
Próbowałem też dodawać kwalifikatory, ale to niczego nie zmieniło.

Odpowiedz

20

po prostu bawił się z konstruktem, poczytać trochę spoiny docu i dowiedział się, co następuje.

Używasz komponentów EJB, które implementują interfejs, więc widok bez interfejsu nie jest już możliwy (oczywiście), ale próbujesz uzyskać bezpośredni dostęp do implementacji. Jak tylko zadeklarujesz to jako EJB, musisz pamiętać o konwencjach. Tak więc, jeśli zdefiniujesz interfejs, musisz go użyć, aby uzyskać dostęp do EJB. Zmieniając go do dalszej części, powinien wypracować:

@Inject 
private ChildOne firstBean; 

Dostęp do realizacji choć interfejs zdefiniowany jest tylko możliwe dla zwykłego CDI Managed Beans (zajęcia bez @ Stateless/@ Stateful adnotacji). Pozbądź się więc adnotacji i to się uda.

Tylko dla twoich informacji, jeśli używasz Glassfish. Jeśli trzymasz się EJB i próbujesz uzyskać dostęp do metody nadrzędnych interfejsów, natrafisz na błąd/wyjątek this.

+0

Dziękuję za tonę! Naprawdę dobre wyjaśnienie! I już wpadłem na ten wyjątek "Nie można przekonwertować ejbRef na ejb ...", po prostu nie wiedziałem, że to znany problem. – jFrenetic

+0

Sprawdziłem to jeszcze raz. Próbowałem wstrzyknąć te EJB poprzez odniesienie do interfejsu, jak sugerowałeś.I nadal otrzymuję wyjątek 'Niezadowolonych zależności ...' podczas wdrażania. Nawet przypisałem interfejsy do @Local. Nadal to nie działa. – jFrenetic

+0

Wypróbowałem to wczoraj i zadziałało to dla mnie, co więcej, miało to sens. W każdym razie, wypróbuję go ponownie, kiedy będę w domu. –

0

Czy próbowałeś użyć adnotacji @EJB, a nie adnotacji CDI @ inject?

E.g.

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

Nie, nie mam. Dzięki za pomysł, ale naprawdę chcę zrozumieć, co robię źle tutaj. – jFrenetic

+0

Czy masz plik bean.xml w swoim META-INF? –

+0

Oczywiście. Gdybym go nie miał, wówczas WELD nie wykrył moich komponentów CDI i nie przeprowadził sprawdzania poprawności podczas wdrażania. – jFrenetic

6

Lepiej późno niż wcale:

adnotacji SLSB aditionally z @LocalBean działa na mnie z JBoss AS 7.1.1. Nie podoba mi się pomysł stworzenia interfejsu bez żadnej dodatkowej wartości.

Korzystanie przykład:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

@Stateless 
@LocalBean 
public class SecondBean implements ChildTwo { } 
+0

@atamanroman , czy wiesz, czy ta metoda jest przenośna? Ponieważ definicja '@ LocalBean' brzmi" Wyjaśnia, że ​​** sesja ** komponent eksponuje widok bez interfejsu "i jako że nie jest to komponent" sesji ", czy będzie działał wszędzie i czy jest to właściwe? –

+1

@AnthonyO. Bezstanowe ziarna sesji i stanowe ziarna sesyjne są komponentami sesji. Tak, tak jest dokładnie tak, jak wymaga tego standard. – atamanroman

+0

Działa również w JBoss 6.1.0 – Ste