2016-04-05 11 views
0

CDIで非常に簡単な点はありません!CDIでインターフェイスをインジェクトする

私は自分のアプリケーションでこれらのクラスを持っている:

org.jboss.weld.exceptions.DeploymentException:WELD-001408を

public class CarrelloController extends AbstractController { 

    @Inject CarrelloService carrelloService; 

    ... 
} 


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

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

はしかし、私が展開した後、次のエラーを取得しています: 修飾子付きのCarrelloServiceタイプの満たされていない依存性 @注入ポイントのデフォルト[BackedAnnotatedField] @Inject @Default it.footballove.web.controller.CarrelloController.carrelloService at org.jbossでorg.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) で3210 it.footballove.web.controller.CarrelloController.carrelloService(CarrelloController.java:0)

。 weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) でorg.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) org.jboss.weld.bootstrap.Validator.validateRIBean(でValidator.java:155) at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518) at org.jboss.weld.b ootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:68) でorg.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:66) org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.callで のjavaでjava.util.concurrent.FutureTask.runで org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.callは(IterativeWorkerTaskFactory.java:53)で(IterativeWorkerTaskFactory.java:60) (FutureTask.java:266) .util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) を に移動します。java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java: 745)例外0:

これはインターフェイスを使用した場合にのみ得られます。代わりに抽象クラスは問題ありません!

なぜですか?

+0

私はあなたが意味することを理解していません_Iは、インターフェイスを使用しているだけです。代わりに抽象クラスは問題ありません!_。あなたが投稿したコードは、注入ポイントのタイプがクラス 'CarrelloService'であり、そのインターフェース' CarrelloDataProvider'ではないことを示しています。なぜあなたはそうしていますか? –

+0

その場合、私は具体的な具体的な実装が必要であることを知っているからです。 私が抽象クラスとしてCarrelloDataProviderを定義し、それを拡張するようにしてもエラーは発生しません。 –

答えて

2

これは、EJBがCDIで動作する方法です。 CDI bean types of an EJBは、実装クラスではなく、EJBのビジネスインタフェースから提供されます。ビジネスインタフェースは、@Local注釈で明示的に宣言することができます。

場合によっては、ビジネスインタフェースのデフォルトは宣言されたインタフェースCarelloDataProviderのみになります。したがって、実際にはタイプCarelloServiceのCDI Beanはありません。

提案:

CarelloServiceImplにあなたのEJBクラスの名前を変更し、あなたがCarelloControllerに必要な追加メソッドを含むインタフェースCarelloServiceをくくり出します。

@Stateless 
public class CarelloServiceImpl implements CarelloService { 
} 

public interface CarelloService extends CarelloDataProvider { 
} 

それとも、あなたのデザインを再考 - あなたがインターフェイスに含まれていない実装のメソッドにアクセスする必要がある場合、通常、これは不一致抽象化の症状です。

関連する問題