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

如何在不使用限定符的情况下选择特定的bean实现?

梁丘佑运
2023-03-14

我在运行时通过我的应用程序中的producer提供注入服务接口的实现。

最近,一个协作团队中的某个人创建了同一服务接口的另一个实现,并且该类被添加到了一个jar中,这是我在应用程序中无法避免的。因此,这会引发不明确的依赖项异常,我可以通过生产者方法和注入点上的CDI限定符来解决该异常。我想问一下是否有其他方法可以避免这种开销。我可以使用我的@products方法作为默认实现,使容器忽略第二个实现吗?我在producer方法上添加了@Default注释和@Produces注释,以检查这是否解决了问题,因为默认情况下,每个注入都使用@Default注释。但那没用。

共有2个答案

孟均
2023-03-14

如果您不能使用@Vetoed注释第二个实现,我会编写一个CDI扩展,通过ProcessAnnotatedType否决类

private void vetoSecondImpl(@Observes ProcessAnnotatedType<YourSecondImpl> pat) {
    pat.veto();
}

以下是规范中的参考:http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#init_events

段干靖
2023-03-14

您可以使用以下选项来避免为新实现创建新限定符的开销。

>

  • 使用内置限定符@Named,它允许您通过字符串指定实现。(但它不使用CDI类型的安全注入功能)

    创建一个具有enum属性的限定符。每个枚举值表示一个实现。此枚举属性指定要注入的实现。(注入是类型安全的。请参见此示例

  •  类似资料:
    • 问题内容: 在Mongoose的早期版本(针对node.js)中,可以选择使用它而不定义架构 但是在当前版本中,“ noSchema”功能已被删除。我的架构可能会经常更改,并且实际上不适合已定义的架构,因此,是否有一种新的方式在猫鼬中使用无架构的模型? 问题答案: 我想这就是您要寻找猫鼬严密的东西 选项:严格 严格选项(默认情况下启用)可确保未在架构中指定的添加到模型实例的值不会保存到数据库中。

    • 我可以使用此命令添加Jfram对象 然而,当我在一个单独的方法中编写这个时,我无法添加,因为“this”方法位于该对象内。 如何选择jframe而不是“this” 我不想创建新的jframe,因为已经有了

    • 问题内容: 因此,我有两个表格学生(PK sID)和导师(PK pID)。这个查询 提供这个结果 我正在尝试以此顺序获取不同的导师ID的列表,因此我正在寻找要生成的SQL 如果仅在SELECT子句中插入DISTINCT,我将得到意外的结果10、9、3(错误的顺序)。任何帮助,不胜感激。 问题答案:

    • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul

    • 我有一个简单的Quarkus资源: 我试图将实例注入到我的资源中,但是我得到了一个。但是,如果我在上使用注释,那么一切都很好。是否有一种方法可以在不使用注释的情况下将类注入到我的资源中?换句话说,是否有一种方法可以使Quakus容器可以发现而不直接注释该类? 编辑:查看CDI文档,似乎可以使用带有注释的方法手动注册bean。但是,我不清楚哪个类应该包含带注释的方法) 另一个选择是使用Jandex索

    • 如果id值不断变化,如何使用css选择器通配符? 这是在id#12374为每个新行更改的表中。我正在寻找selenium以单击EDIT按钮。 当我使用< code > CSS selector:a[href * = '/MAC 1/notification/edit?$id='*]测试失败,消息如下 原因:org . open QA . selenium . invalidselectorexce