JAVA cdi中文_关于java:使用CDI注入接口实现

本文讨论了在Java CDI中遇到的部署异常,该异常涉及未满足的依赖于CarrelloService接口的注入点。问题在于,尽管EJB可以通过其业务接口被CDI识别,但在这种情况下,CDI无法找到具体的CarrelloService实现。解决方案包括将EJB类重命名为带有实现接口的ServiceImpl,或者重新考虑设计以避免抽象不匹配。此外,示例还展示了如何在涉及抽象类和接口的场景中正确配置注入。
摘要由CSDN通过智能技术生成

我对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:

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$1.doWork(ConcurrentValidator.java:68)

at

org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)

at

org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)

at

org.jboss.weld.executor.IterativeWorkerTaskFactory$1.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 :

我只能使用一个接口。 相反,抽象类没有问题!

为什么?

我不理解您的意思,仅通过接口即可理解。 相反,抽象类没有问题! 您发布的代码显示注入点的类型是类CarrelloService,而不是其接口CarrelloDataProvider。 你为什么要这么做?

因为在那种情况下,我知道我需要该特定的具体实现。 如果将CarrelloDataProvider定义为抽象类,并使服务对其进行扩展,则不会出错。

这就是EJB与CDI协同工作的方式。 EJB的CDI bean类型是由EJB的业务接口给定的,而不是由实现类给定的。可以使用@Local注释显式声明业务接口。

在您的情况下,业务接口默认为一个唯一声明的接口CarelloDataProvider。因此,实际上没有类型为CarelloService的CDI bean。

建议:

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

@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 { ...}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值