2012-01-27 13 views
11

İşte durum. WELD-001408 Arabirimleri uygularken EJB'leri enjekte ederken bağımlı olmayan bağımlılıklar

Ben ettik aşağıdaki arabirimler var:

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

ve 2 EJB'ler:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

Ve ayrıca bu CDI Fasulye:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

bu dağıtmak çalışırken Glassfish 3.1 üzerinde aşağıdaki istisnai olsun:

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) 

Her iki EJB, Parent arabirimini uygularken, istisna aynıdır.
Ayrıca, niteleyiciler eklemeye çalıştım, ancak bu hiçbir şeyi değiştirmedi.

cevap

20

Ben sadece yapı etrafında oynanan kaynak docu biraz okumak ve aşağıdaki öğrendim.

Arabirim uygulayan EJB'leri kullanıyorsunuz, dolayısıyla arabirimsiz görünüm artık mümkün değil (açıkça), ancak doğrudan uygulamaya erişmeye çalışıyorsunuz. Bunu bir EJB olarak ilan ettiğiniz anda, konvansiyonları akılda tutmak zorundasınız. Dolayısıyla, bir arayüz tanımlarsanız, EJB'ye erişmek için onu kullanmanız gerekir. Aşağıda bunu değiştirme, dışarı çalışması gerekir: bir arayüz tanımlanır halde uygulanmasını Erişme

@Inject 
private ChildOne firstBean; 

düz CDI Yönetilen Fasulye için sadece mümkündür (Duruma ek açıklamalar @ @ Vatansız/olmaksızın sınıflar). Yani ek açıklamadan kurtulun ve işe yarayacak.

Sadece bilgi almak için Glassfish kullanıyorsanız. EJB'lere yapışır ve ana arabirim yöntemine erişmeye çalışırsanız, this hata/özel durumuna girersiniz. 7.1.1 AS JBoss ile benim için @LocalBean eserlerle aditionally SLSB annotating

: Geç olsun güç olmasın

+0

Bir ton teşekkürler! Gerçekten iyi bir açıklama! Ve ejbRef ejb ... 'ye dönüştürülemedi, bu istisna ile karşılaştım. Bildiğim bir sorun olduğunu bilmiyordum. – jFrenetic

+0

Bir kez daha kontrol ettim. Bu EJB'leri önerdiğiniz gibi arayüz referansıyla enjekte etmeye çalıştım.Ve hala dağıtım sırasında bu "İstenmeyen bağımlılıklar ..." istisnasını alıyorum. @Local ile arayüzleri bile ekledim. Hala çalışmıyor. – jFrenetic

+0

Dün denedim ve benim için çalıştı, ayrıca biraz mantıklı. Her neyse, eve döndüğümde tekrar deneyeceğim. –

0

@EJB ek açıklamasını CDI @ inject açıklamasını kullanmayı denediniz mi?

E.g.

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

Hayır, yok. Fikir için teşekkürler, ama gerçekten burada ne yapıyorum anlamak istiyorum. – jFrenetic

+0

META-INF'inizde beans.xml var mı? –

+0

Eminim. Eğer sahip olmadıysam, WELD CDI çekirdeklerimi tespit edemez ve dağıtım sırasında doğrulama yapmazdı. – jFrenetic

6

iyi. Katma değer için arayüz yaratma fikrini sevmiyorum.

sizin örneği kullanarak:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

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

@atamanroman Bu yöntemin taşınabilir olup olmadığını biliyor musunuz? '@ LocalBean' için tanım," bir ** oturumı ** fasulyenin arayüzsüz bir görünüm oluşturduğunu belirtir "ve burada bir" oturum "fasulyesi olmadığından, her yerde çalışacak ve yapılması gereken doğru şey mi olduğu için mi? –

+1

@AnthonyO. Durum bilgisi olmayan oturum çekirdeklerinin ve durum bilgisi olan oturum çekirdeklerinin her ikisi de oturum çekirdekleridir. Yani evet, bu tam olarak standart gerektirir. – atamanroman

+0

JBoss 6.1.0 için de çalışıyor – Ste

İlgili konular