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

使用CDI生成器会导致不明确的依赖项异常

闾丘昊然
2023-03-14

我需要将应用程序范围的bean的同一个实例注入到我的应用程序的几个地方,并创建了以下工厂类,该类使用@PostConstruct注释来初始化bean,@生成注释来返回bean的同一个实例。

@ApplicationScoped
public class CommandBusFactory implements Serializable {

    private static final long serialVersionUID = 1L;

    private CommandBus commandBus;

    @PostConstruct
    public void init() {
        commandBus = new BasicCommandBus();
        // Do some stuff to configure the command bus
    }

    @Produces
    public CommandBus produceCommandBus() {
        return commandBus;
    }

}

我遇到的问题是,当我部署应用程序GlassFish时,会返回以下错误消息:

Exception while loading the app : CDI deployment failure:WELD-001409 Ambiguous dependencies for type [CommandBus] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private myapp.web.ToDoItemCommandController.commandBus]. Possible dependencies [[Producer Method [CommandBus] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces public myapp.core.cdi.CommandBusFactory.produceCommandBus()], Managed Bean [class myapp.core.commandhandling.BasicCommandBus] with qualifiers [@Any @Default]]]

我可以通过添加@替代注释来克服这个异常,但是这似乎不是解决问题的最佳方法。

我不想在应用程序中到处添加一个限定符,因为使用不同的实现需要在多个地方更改代码。其目的是,工厂的更高版本将读取配置文件,并根据配置文件中的值,它可能会创建不同类型的命令总线

我已经读了这个问题的答案(https://stackoverflow.com/a/18782027/1274662)并且理解为什么会抛出模糊依赖项异常,但我不知道的是处理以下事实的最佳方法:有两个可能的bean可以被注入,因为我想决定使用哪个实现,以及如何在中心位置初始化它。

我的问题是:

>

  • BasicCommandBus类上使用@Alternative注释是正确的方法吗?

    我是否应该使用更好的方法将应用程序处理的bean(即CommandBus)的同一个实例注入我的应用程序的多个位置,同时控制创建了哪个实现(即BasicCommandBus增强的CommandBus)以及它在中央数据库中的初始化方式地方


  • 共有1个答案

    简俊楚
    2023-03-14

    如果你想让你的bean只能由生产者注入,你可以用@Vetoed注释BasicCommandBusEnhancedCommandBus,这样你就不会在bean本身和生产者方法之间产生歧义,在每个注入点,生产者将注入实例

     类似资料:
    • 我正在创建构建一个jar,其中也将包括它的依赖关系。我正在使用maven阴影插件。但是获取错误。我试图排除传递依赖项,如下所示,仍然得到错误。

    • 我试图修改我们现有的CDI扩展,它创建自己的代理bean。现在只有一个为每个服务创建的代理。服务有类似于应用程序范围的东西,所以服务总是只有一个实例。 我想要完成的是为每个注入点创建一个代理bean。我需要它们来存储特定于给定注射点的一些信息。如果同一个服务有更多的注入点,那么将有更多的代理bean,但它们后面仍然有一个服务实例。但是,当我以这种方式更改行为时,Weld会抱怨不明确的依赖关系,因为

    • 我在尝试部署web应用程序时遇到以下错误: 在注入点[BackedAnnotatedField]处具有限定符@Default\n的AuthzInfo类型的依赖项不明确 可能的依赖项:\n-Producer方法[AuthzInfo],其限定符[@Any@Default]声明为[[BackedAnnotatedMethod]@producers@RequestScoped 我只创造了一个这样的制作人:

    • 我正在从WF 7.4.0迁移。最终比分为16.0.0。最终的在解决了不同模块的升级问题后,我遇到了以下问题:一个不明确的依赖项异常。如何保持与两个数据库的连接? SessionFactory hibernate-core-5.3.9现在似乎是从EntityManagerFactory扩展过来的,而它没有扩展到hibernate-core-4.2.14(WF7.4)。SessionFactory在H

    • 我有什么似乎是一个简单的问题,关于如何设置Jenkins和maven 3。 为了简单起见,假设我们有四个项目: 没有依赖关系的模型 Commons依赖于模型 服务器依赖于Common和模型 前端依赖于模型 我想要实现的是,一个成功的基于模型的构建触发所有项目的新构建,这些项目在其pom中依赖于模型(这里是公共的,服务器和前端) 如果Common失败,则无需构建服务器。 在上述情况下,我似乎可以通过

    • 我在试着设置QAF。早些时候,当我设置框架时,我可以在控制台和输出日志文件中看到驱动程序日志。但现在我看不到他们了。我没有在日志文件配置或它的目录中做任何更改。有人能给我一些建议吗?