2016-04-05 15 views
0

CDI'da çok basit bir noktaya ulaşamıyorum!CDI ile enjeksiyon arabirimi uygulaması

benim uygulamada bu sınıflara sahip:

public class CarrelloController extends AbstractController { 

    @Inject CarrelloService carrelloService; 

    ... 
} 


@Stateless 
public class CarrelloService implements CarrelloDataProvider { 
    ... 
} 

public interface CarrelloDataProvider { 
    public Oggetto getSomething(String foo); 
} 

Ancak, kurulumundan hemen sonra aşağıdaki hatayı alıyorum:

org.jboss.weld.exceptions.DeploymentException: KAYNAK 001408 : Niteleyicilerle birlikte CarrelloService türü için bağımlı olmayan bağımlılıklar @ Enjeksiyon noktasında boş bırakma [BackedAnnotatedField] @Inject @Default it.footballove.web.controller.CarrelloController.carrelloService at it.footballove.web.controller.CarrelloController.carrelloService (CarrelloController.java:0) org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems (Validator.java:359) org.jboss en de

. org.jboss.weld.bootstrap.Validator.validateRIBean de weld.bootstrap.Validator.validateInjectionPoint org.jboss.weld.bootstrap.Validator.validateGeneralBean (Validator.java:134) 'den (Validator.java:281) (Validator.java:155) org.jboss.weld.bootstrap.Validator.validateBean (Validator.java:518) org.jboss.weld.b adresinden de org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:66) de ootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:68) org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call java de java.util.concurrent.FutureTask.run de org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call (IterativeWorkerTaskFactory.java:53) 'den (IterativeWorkerTaskFactory.java:60) (FutureTask.java:266) .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) adresinde yer alan java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) java.lang.Thread.run (Thread.java: 745) İstisna 0:

Sadece bir arabirim kullanarak anladım. Soyut sınıf yerine hiçbir sorun çıkarmaz!

Neden?

+0

Ne demek istediğimi anlamıyorum _Bunu sadece bir arabirim kullanarak elde ediyorum. Soyut sınıf yerine sorun çıkarmaz! _. Gönderdiğiniz kod, enjeksiyon noktasının türünün "CarrelloService" sınıfı olduğunu ve "CarrelloDataProvider" arayüzünü göstermediğini gösterir. Neden böyle yapıyorsun? –

+0

Çünkü bu durumda, bu somut uygulamaya ihtiyacım olduğunu biliyorum. CarrelloDataProvider'ı soyut bir sınıf olarak tanımlar ve hizmeti genişletirseniz, hata alıyorum. –

cevap

2

Bu, EJB'lerin CDI ile çalışma şeklidir. CDI bean types of an EJB, uygulama sınıfı tarafından değil, EJB'nin iş arabirimi tarafından verilir. İş arabirimi, bir @Local ek açıklamayla açıkça bildirilebilir.

Durumunuzda, iş arabirimi varsayılan olarak bir ve yalnızca bildirilen arabirime CarelloDataProvider karşılık gelir. Yani gerçekte CarelloService türünde bir CDI çekirdeği yok.

Öneri:

CarelloServiceImpl için EJB sınıfını yeniden adlandırma ve CarelloController ihtiyacımız olacak bir yöntemlerini içeren bir arayüz CarelloService dışarıda tutarsınız.

@Stateless 
public class CarelloServiceImpl implements CarelloService { 
} 

public interface CarelloService extends CarelloDataProvider { 
} 

Ya da sadece tasarımınızı yeniden - Bir arayüzde yer almayan bir uygulama yöntemini erişmeniz gerektiğinde genellikle, bu uyumsuz soyut bir belirtisidir.