使用 CDI 注入接口实现
Inject interface implementation with CDI
我无法得到关于 CDI 的非常简单的观点!
我的申请中有这些 class:
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:
Unsatisfied dependencies for type CarrelloService with qualifiers
@Default at injection point [BackedAnnotatedField] @Inject @Default
it.footballove.web.controller.CarrelloController.carrelloService at
it.footballove.web.controller.CarrelloController.carrelloService(CarrelloController.java:0)
at
org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359)
at
org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281)
at
org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
at
org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155)
at
org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518)
at
org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:68)
at
org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:66)
at
org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:60)
at
org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:53)
at java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745) Exception 0 :
我只使用一个界面就知道了。摘要class反而没问题!
为什么?
这是 EJB 与 CDI 一起工作的方式。 CDI bean types of an EJB 由 EJB 的业务接口提供,而不是由实现 class 提供。可以使用 @Local
注释显式声明业务接口。
在您的情况下,业务接口默认为唯一声明的接口 CarelloDataProvider
。所以确实没有 CarelloService
.
类型的 CDI bean
建议:
将您的 EJB class 重命名为 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 对 classes 进行注解...但没有奏效。
为了使注入与抽象一起工作 class,需要在服务 bean 中显式实现接口:
public class DefaultFileImporter extends DefaultImporter implements Importer, Serializable { ...}
简单的说:implement explicit 要注入实现的接口(除了抽象class)。
我无法得到关于 CDI 的非常简单的观点!
我的申请中有这些 class:
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: Unsatisfied dependencies for type CarrelloService with qualifiers @Default at injection point [BackedAnnotatedField] @Inject @Default it.footballove.web.controller.CarrelloController.carrelloService at it.footballove.web.controller.CarrelloController.carrelloService(CarrelloController.java:0)
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155) at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518) at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:68) at org.jboss.weld.bootstrap.ConcurrentValidator.doWork(ConcurrentValidator.java:66) at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:60) at org.jboss.weld.executor.IterativeWorkerTaskFactory.call(IterativeWorkerTaskFactory.java:53) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Exception 0 :
我只使用一个界面就知道了。摘要class反而没问题!
为什么?
这是 EJB 与 CDI 一起工作的方式。 CDI bean types of an EJB 由 EJB 的业务接口提供,而不是由实现 class 提供。可以使用 @Local
注释显式声明业务接口。
在您的情况下,业务接口默认为唯一声明的接口 CarelloDataProvider
。所以确实没有 CarelloService
.
建议:
将您的 EJB class 重命名为 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 对 classes 进行注解...但没有奏效。
为了使注入与抽象一起工作 class,需要在服务 bean 中显式实现接口:
public class DefaultFileImporter extends DefaultImporter implements Importer, Serializable { ...}
简单的说:implement explicit 要注入实现的接口(除了抽象class)。