我需要将ApplicationScoped
bean的同一个实例注入到我的应用程序的几个位置,并创建了以下工厂类,它使用@PostConstruct
注释初始化bean和{{ 1}}注释返回bean的相同实例。
@Produces
我遇到的问题是我部署应用程序时GlassFish返回以下错误消息:
@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;
}
}
我可以通过将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]]]
注释添加到BasicCommandBus类来克服此异常,但这似乎并不是解决问题的最佳方法。
我不想在我向应用程序注入@Alternative
的任何地方添加限定符,因为使用CommandBus
的不同实现需要在多个位置更改代码。目的是工厂的更高版本将读取配置文件,并根据配置文件中的值创建不同类型的CommandBus
。
我已经阅读了这个问题的答案(https://stackoverflow.com/a/18782027/1274662),并理解为什么抛出不明确的依赖异常,但我不知道的是处理有两个事实的最佳方法考虑到我想决定使用哪种实现以及如何在中心位置初始化,可以注入可能的bean。
我得到的问题是:
正在使用CommandBus
类的@Alternative
注释正确方法吗?
我是否应该使用更好的方法将BasicCommandBus
bean的相同实例(即ApplicationScoped
)注入我的应用程序的几个位置,同时控制创建的实现(即CommandBus
或BasicCommandBus
)以及如何在中心位置进行初始化?
答案 0 :(得分:3)
如果您希望您的bean只能由生产者注入,您可以使用BasicCommandBus
注释EnhancedCommandBus
和@Vetoed
,这样您就不会在它自己的bean之间产生歧义生产者方法,在每个注入点,它都是将注入实例的生产者。