2016-04-05 7 views
0

Ich kann nicht einen sehr einfachen Punkt auf CDI bekommen!Inject Schnittstelle Implementierung mit CDI

Ich habe diese Klassen in meiner Anwendung:

public class CarrelloController extends AbstractController { 

    @Inject CarrelloService carrelloService; 

    ... 
} 


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

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

Allerdings ist mir die folgende Fehlermeldung erhalten, nach der Bereitstellung:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 : Unzufriedene Abhängigkeiten für den Typ CarrelloService mit Qualifiern @Default am Injektionspunkt [BackedAnnotatedField] @Inject @Default it.footballove.web.controller.CarrelloController.carrelloService unter it.footballove.web.controller.CarrelloController.carrelloService (CarrelloController.java:0)

bei org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems (Validator.java:359) bei org.jboss. weld.bootstrap.Validator.validateInjectionPoint (Validator.java:281) bei org.jboss.weld.bootstrap.Validator.validateGeneralBean (Validator.java:134) bei org.jboss.weld.bootstrap.Validator.validateRIBean (Validator.java:155) unter org.jboss.weld.bootstrap.Validator.validateBean (Validator.java:518) unter org.jboss.weld.b ootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:68) bei org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork (ConcurrentValidator.java:66) bei org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call (IterativeWorkerTaskFactory.java:60) bei org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call (IterativeWorkerTaskFactory.java:53) bei java.util.concurrent.FutureTask.run (FutureTask.java:266) bei java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) um java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) bei java.lang.Thread.run (Thread.java: 745) Ausnahme 0:

Ich bekomme das nur mit einer Schnittstelle. Abstrakte Klasse macht stattdessen kein Problem!

Warum?

+0

Ich verstehe nicht, was du meinst mit _Ich bekomme das nur mit einer Schnittstelle. Abstrakte Klasse macht stattdessen kein Problem! _. Der von Ihnen gepostete Code zeigt, dass der Typ des Injektionspunkts die Klasse "CarrelloService" und nicht dessen Schnittstelle "CarrelloDataProvider" ist. Warum machst du das? –

+0

Denn in diesem Fall weiß ich, dass ich diese konkrete konkrete Umsetzung brauche. Wenn ich CarrelloDataProvider als eine abstrakte Klasse definieren und den Dienst erweitern, erhalte ich keine Fehler. –

Antwort

2

So arbeiten EJBs mit CDI. Die CDI bean types of an EJB werden von der Business-Schnittstelle des EJB und nicht von der Implementierungsklasse angegeben. Die Business-Schnittstelle kann explizit mit einer @Local Annotation deklariert werden.

In Ihrem Fall ist die Business-Schnittstelle standardmäßig die einzige Schnittstelle CarelloDataProvider. Es gibt also wirklich keine CDI-Bean vom Typ CarelloService.

Vorschlag:

Benennen Sie Ihre EJB-Klasse CarelloServiceImpl und eine Schnittstelle ausklammern CarelloService die zusätzlichen Methoden, die Sie im CarelloController benötigen.

@Stateless 
public class CarelloServiceImpl implements CarelloService { 
} 

public interface CarelloService extends CarelloDataProvider { 
} 

Oder einfach nur Ihr Design überdenken - in der Regel, wenn Sie eine Implementierungsmethode nicht in einer Schnittstelle enthielt zugreifen müssen, ist dies ein Symptom für mismatched Abstraktionen.