我无法在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)at 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:
我只使用接口。相反,抽象类没有问题!
为什么?
答案 0 :(得分:2)
这是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 {
}
或者只是重新考虑您的设计 - 通常,当您需要访问未包含在界面中的实现方法时,这是抽象不匹配的症状。
答案 1 :(得分:0)
在以下情况下,我遇到了相同的问题:
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 { ...}
简单说:实现显式要注入到实现中的接口(除了抽象类外)。