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

如何强制使用CDI生产者方法?

松铭
2023-03-14

我在这里的部分问题是使用正确的词汇,所以我提前为可能是一个简单的术语问题道歉。

假设我有一个Person接口和一个实现该接口的Person类。

进一步假设我在某个地方有一个生产者方法(注释为@Produces),它返回一个Person。在内部,它返回一个新的个性豆,但这既不是这里也不是那里。

最后,假设我有另一个CDIBean,其注入点定义如下:

@Inject
private Person person;

假设我有所有的bean。xml文件就位等,并具有自举焊接或其他符合CDI-1.0的环境,因此我将得到一个不明确的定义错误。这很有意义:Weld将找到我的PersonBean作为注入候选(它可以调用构造函数),并将找到我的生产者方法的输出作为注入候选。

我想做的是以某种方式强制此应用程序中Person实例的生成始终通过producer方法进行路由。

我知道我可以在某处发明一些限定符,并使producer方法生成由该限定符限定的Person实例。如果我这样做了,并将我的注入点更改为包含限定符,那么很明显,这些限定的注射剂只有一个来源(即我的生产者方法),所以瞧,问题解决了。

但是假设我不想发明一些虚假的限定词。(我并不是说情况就是这样;我只是想更深入地理解问题。)我有什么选择?我有吗?我想我可以把@Typed(Object.class)放在PersonBean上,这样它就不会被CDI看作人了。。。。

欢迎任何想法,包括留档指针,或更好的方式来理解这一点。谢谢。


共有3个答案

束志业
2023-03-14

我想做的是以某种方式强制此应用程序中Person实例的生成始终通过producer方法进行路由。

接缝焊料有一个解决方案。

我不能100%确定Seam 3和Deltaspike的合并将如何发展(页面是90年代的,但内容是:-),但在类路径中添加焊料肯定是安全的。

哦,据我所知,CDI1.1规范中有一个类似的机制。

西门伟
2023-03-14

通过在这里和其他地方消化几个不同的答案,我采用的解决方案是使用值为Object的@Typed注释。在我的bean上初始化。这意味着它只能被注入声明如下的字段:

@Inject
private Object something;

...谢天谢地,它几乎不存在。:-)

万选
2023-03-14

将PersonBean注释为@Alternative,然后它将使用producer方法。

 类似资料:
  • 有人能解释一下CDI范围注释在生产者中的作用吗?他们似乎什么也做不了。 这些,自然地,在启动时给出了这个(省略的)错误。 WELD-001409:类型的依赖关系不明确。可能的依赖关系: 带有限定符[@Any@Default]的生产者方法[Thing]声明为[[BackedAnnotatedMethod]@生成公共pkg。测验东西制作人。thingMaker(), 因此,尽管“RequestScop

  • 我有一个命令行JavaSE应用程序,我想对它进行一点现代化。我想在其他CDI特性中使用拦截器和依赖注入。然而,应用程序的设计并没有考虑CDI或依赖项注入,它广泛使用新的关键字和构造函数参数,而不是将对象创建委托给DI容器。CDI/Weld不会在使用new创建的对象上注入依赖项或运行拦截器,并且根本无法处理构造函数参数。一个简化的例子: Main由CDI容器实例化,someModule被注入,构造函

  • 我有一个消费者作为生产者消费者模式的一部分: 简化: 如果我移除 通过将线程设置为睡眠,CPU使用率攀升到极高的水平(13%),而不是0%。 此外,如果我实例化该类的多个实例,则每个实例的CPU使用率都会以13%的增量攀升。 大约每分钟(可能每30秒)都会向BlockingCollection添加一个新的LogItem,并将适用的消息写入文件。 有没有可能线程以某种方式阻止了其他线程的运行,而系统

  • 生产者方法对于以编程方式创建实例并在上下文中发布它们非常有用。问题是由创建并由生产者方法返回的实例的所有属性都不是由CDI注入的。在焊接留档中,我读到这是一种有意的行为,但在许多情况下,注入这些豆子会非常有用。 是否有一个变通方法来允许注入到这样的bean中?

  • 使用野蝇8.2.0。最后,我相信使用焊接2.2,我已经在Maven多模块项目中用2个简单的类重现了这个问题。一个产生一个,另一个产生一个注入点。Arquillian部署失败与:不满足的依赖关系。生产者位于包含在消费者的WEB-INF/lib中的库jar中。生产者在META-INF中有一个,其中,消费者在WEB-INF中有一个。 复制步骤:下载此项目并从根目录运行。 这是一个关键错误。还有一些关于W

  • 最新版本的kafka支持精确一次语义(EoS)。为了支持这一概念,在每个消息中都添加了额外的详细信息。这意味着在你的消费者;如果打印消息的偏移量,它们不一定是连续的。这使得轮询一个主题以阅读最后提交的消息变得更加困难。 在我的例子中,consumer打印了如下所示的内容 问题:为了编写可重启的proudcer;我对话题进行了投票,并阅读了上一条消息的内容。在这种情况下;最后一条消息将是偏移量#5,