使用CDI注入接口实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CDI注入接口实现相关的知识,希望对你有一定的参考价值。

我不能在CDI上得到一个非常简单的观点!

我在我的应用程序中有这些类:

public class CarrelloController extends AbstractController {

    @Inject CarrelloService carrelloService;

    ...
}


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

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

但是,在部署之后,我收到以下错误:

org.jboss.weld.exceptions.DeploymentException:WELD-001408:CarrelloService类型的不满意依赖关系,注入点有@Default限定符[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.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)在org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518)在org.jboss。 weld.bootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:68)在org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:66)在org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call(IterativeWorkerTaskFactory的.java:60)在org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call(IterativeWorkerTaskFactory.java:53)在java.util.concurrent.FutureTask.run(FutureTask.java:266)在java.util.concurrent.ThreadPoolExecutor中.runWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)在java.lang.Thread.run(Thread.java:745)例外0:

我只使用一个界面。相反,抽象类没有问题!

为什么?

答案

这是EJB与CDI一起工作的方式。 CDI bean types of an EJB由EJB的业务接口提供,而不是由实现类提供。可以使用@Local注释显式声明业务接口。

在您的情况下,业务接口默认为唯一声明的接口CarelloDataProvider。所以真的没有CarelloService类型的CDI bean。

建议:

将您的EJB类重命名为CarelloServiceImpl,并将包含CarelloService中所需的额外方法的接口CarelloController分解出来。

@Stateless
public class CarelloServiceImpl implements CarelloService {
}

public interface CarelloService extends CarelloDataProvider {
}

或者只是重新考虑您的设计 - 通常,当您需要访问未包含在界面中的实现方法时,这是抽象不匹配的症状。

另一答案

我遇到了同样的问题,遵循以下情况:

public interface Importer() { ..... }

具有以下结构:

public abstract class DefaultImporter implements Importer { // some default methods }

最后用于注射的实现:

public class DefaultFileImporter extends DefaultImporter implements Serializable { ...}

这不起作用,并且抛出了上面的WELD异常状态。我试图用@ Named,@ Qualifier,@ Default等来宣布这些类...但是没有用过。

为了使注入与抽象类一起工作,需要在服务bean中显式实现接口:

public class DefaultFileImporter extends DefaultImporter implements Importer, Serializable { ...}

简单说:实现显式接口要注入实现(除了抽象类)。

以上是关于使用CDI注入接口实现的主要内容,如果未能解决你的问题,请参考以下文章

工作流中容器化的依赖注入!Activiti集成CDI实现工作流的可配置型和可扩展型

哪个是 CDI @Produces 注释的 Spring 等效项?

使用 CDI 将 Logger 注入 Ejb

CDI Features

如何使用 CDI 进行方法参数注入?

为啥在 CDI 中使用构造函数而不是 setter 注入?