当前位置: 首页 > 知识库问答 >
问题:

CDI依赖注入可以是可选的吗?

柯易安
2023-03-14

在Spring DI中,将autowired字段声明为可选字段可以使客户端不向其注入任何值。使用Java EE的CDI是否可能做到这一点?我试过可选但失败了。我想知道是否有一个等价的机制我可以使用。

下面是我尝试的:

public class OmeletteMaker implements EggMaker{
        public static void main(String[] args){
        WeldContainer container = new Weld().initialize();
        OmeletteMaker omeletteMaker = container.instance().select(OmeletteMaker.class).get();
    }

    @Inject
    Optional<Vegetable> vegetable;
}

我得到一个错误消息:线程“main”org.jboss.weld.exceptions.deploymentexception:WELD-001408在注入点[[BackedAnnotatedField]@Inject Cafeteria.Omelettemaker.Planete]有限定符[@default]的类型[Optional]的依赖项不满足

共有1个答案

郗阳德
2023-03-14

在这个看似简单的问题中,潜伏着诸多疑问。我将设法回答他们,同时铭记问题的精神。

首先,作为一般规则,如果@inject一个fred,则该fred不能为null,除非fred@dependent作用域中,即使这样,也必须显式编写生成器方法或自定义bean以返回null。存在边缘情况,但在所有现代CDI实现中,这是一条需要记住的经验法则。

其次,optional并不特殊。从CDI的观点来看,optional只是另一个Java对象,所以请参阅上面的第一条语句。如果您有一个生成可选的东西(如生成器方法),那么它就不能使为null为可选(除非再次将生成定义为在@dependent作用域中--如果您编写这样的方法使为可选实例并返回为null,肯定会使用户感到困惑)。如果您控制了可选实例的生成,那么您可以以任何方式生成它们。

第三,如果您希望测试是否存在fred的托管bean或某种类型的生产者,那么您可以按照您的问题的注释之一,注入提供程序 实例 。这些是由容器自动“制造”的:您不必编写任何特别的东西来自己生产它们。提供程序 fred实例的访问器,在调用其get()方法之前不会尝试获取实例。实例是所有已知fred提供者迭代并且还可以告诉您:(a)它是否“不满意”--根本不存在fred的生产者--以及(b)它是否“可解析”--即。fred只有一个制作者。

第四,在您想要查看是否存在某些东西的情况下,常见的习惯用法是注入一个用您想要的类型参数化的实例,然后检查它的isResolvable()方法。如果返回true,那么您可以调用它的get()方法,并相信它的返回值将是非null(假设它生成的东西不在@dependent范围内)。

我希望这是有帮助的!

 类似资料:
  • 然而,Eclipse告诉我“没有bean可以被注入到注入点[JSR-299§5.2.1]”。我做错了什么?你有没有看到我缺少的东西。如有任何帮助,我们将不胜感激。 谢谢!!

  • 我希望是需要非序列化依赖项才能完成其工作的东西。 我知道我能做到: 这将从源代码读取的字符串包装在包含依赖项的另一个对象中,从而使能够访问这些依赖项,而不需要将它们注入到该对象本身。这是可行的,但我想在Jet之外使用我的映射函数,也是管道的一部分,在这种情况下,必须将依赖关系与被映射的项一起传递,而不是仅仅用它需要的依赖关系初始化映射器,这有点奇怪。它还迫使我毫无意义地在我的流/批处理中为每个项创

  • 问题内容: 我在Android应用程序中将Dagger2用于DI。我发现我必须为使用@Inject字段的每个类编写注入方法。有没有一种方法可以只注入父类,而不必在每个子类上调用inject?以活动为例。我有一个“ 每个活动都从中延伸”的内容。有没有一种方法,我可以在BaseActivity的组件中创建一个注入方法,然后在BaseActivity的onCreate中调用inject,子活动中的@in

  • 问题内容: 我可以将自己的POJO注入到托管对象中,如下所示: 我有这个POJO: 这很好。如果将EJB注入到JSF支持bean中,则可以看到,按预期,该值是非null值。 但是,如果我尝试注入到,我得到部署以下异常: SomeEjb现在: Date有一个公开的,无参数的构造函数,我认为CDI只需“满足依赖性”即可。我确信这种行为是“符合规格”的,但是显然我对CDI的理解还存在很大的漏洞。 有人可

  • 我有一个叫做Container的类: ServiceB依赖于ServiceA: 在我的应用程序中可以有几个容器。现在,有没有什么诀窍可以将这个已经被注入到与ServiceB相同的容器实例中的ServiceA实例注入到ServiceB中呢?

  • 主要内容:排除依赖,可选依赖,排除依赖 VS 可选依赖 我们知道 Maven 依赖具有传递性,例如 A 依赖于 B,B 依赖于 C,在不考虑依赖范围等因素的情况下,Maven 会根据依赖传递机制,将间接依赖 C 引入到 A 中。但如果 A 出于某种原因,希望将间接依赖 C 排除,那该怎么办呢?Maven 为用户提供了两种解决方式:排除依赖(Dependency Exclusions)和可选依赖(Optional Dependencies)。 排除依赖