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

使用CDI扩展解决不明确的依赖关系

曹浩波
2023-03-14

我试图修改我们现有的CDI扩展,它创建自己的代理bean。现在只有一个为每个服务创建的代理。服务有类似于应用程序范围的东西,所以服务总是只有一个实例

我想要完成的是为每个注入点创建一个代理bean。我需要它们来存储特定于给定注射点的一些信息。如果同一个服务有更多的注入点,那么将有更多的代理bean,但它们后面仍然有一个服务实例。但是,当我以这种方式更改行为时,Weld会抱怨不明确的依赖关系,因为它无法在两个完全相同的代理之间进行选择。

我怎样才能解决这个问题?基本上,我所做的是观察ProcessBean事件,并为每个发现的bean的每个注入点创建一个新的代理。然后我使用AfterBeanDiscovery#addBean方法将所有这些代理bean添加到容器中。我可能需要跳过最后一步,手动将它们注入到它们的注入点,或者能够影响选择要注入的正确bean的决定。如果给我一个注入点和一个可以注入的模糊依赖列表,我将能够根据它的属性选择正确的一个。但我真的不知道是否有可能对焊接做出这个决定,以及我如何才能做到这一点。

编辑:我想做的只是实现我自己的作用域,类似于@Dependent,但使用代理,我可以在其中存储与给定注入点相关的一些附加信息。

EDIT2:我最终通过创建一个新的限定符来修复它,该限定符包含关于特定注入点的信息。此限定符同时添加到注入点及其代理。但这不是一个很好的解决方案,因为我必须用自己的实现替换注入点,它允许修改限定符集合。我觉得必须有一个更优雅的解决方案。如果你能想到什么,请告诉我。

共有1个答案

龚弘业
2023-03-14

首先,使用限定符来说明您的解决方案-这确实是正确的方法,但是在给定的情况下,我想有点多余的工作。

如果我理解正确,你可以在一个扩展中使用两个观察者。

首先要观察的是ProcessBeanAtinites阶段和veto()您不想要的原始bean。

void observePBA(@Observes ProcessBeanAttributes<?> bean) {
  // I used '?' as a type, so here you do your check for 
  // the actual bean class to know which one is it and whether
  // you actually want to veto such bean
  bean.veto();
}

另一个观察者是您已经拥有的——在AfterBeanDiscovery#addBean中添加您自己的bean。

void observeABD(@Observes AfterBeanDiscovery abd) {
  // add your custom bean, assuming you have it prepared somewhere
  abd.addBean(myCustomBean);
}

这样,当容器启动时,您将删除原始bean并添加自定义bean。这样,Weld就不会有模糊的分辨率问题。

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

  • 我有下一个结构: > QUARKUS扩展'core',带有接口的某些接口和bean的某些容器: Quarkus扩展与SomeImpl bean的“实现”: quokus应用程序-'starter',它依赖于quokus扩展'实现'和jax rs控制器: 当我尝试启动应用程序时,我收到一个错误: 如何修复它?链接到项目https://github.com/flagmen/quarkus-test

  • 我需要将bean的同一个实例注入到我的应用程序的几个地方,并创建了以下工厂类,该类使用注释来初始化bean,注释来返回bean的同一个实例。 我遇到的问题是,当我部署应用程序GlassFish时,会返回以下错误消息: 我可以通过添加注释来克服这个异常,但是这似乎不是解决问题的最佳方法。 我不想在应用程序中到处添加一个限定符,因为使用不同的实现需要在多个地方更改代码。其目的是,工厂的更高版本将读取配

  • 我想下载使用ivy的工件:解决,但使用使用[conf]属性的模式。所以我在IvyS中定义了以下内容ettings.xml 注意这个模式 现在可以很好地解决依赖关系,但只为配置创建了一个文件夹:默认。没有为ConfGroup1创建文件夹 另外,我知道这可以通过使用ivy:retrieve实现,但我不想使用它,因为它将涉及将工件从ivy缓存复制到ivy:resolve之后的另一个地方,我有价值数十亿字

  • 我对ivy没有解析我的一些依赖关系有问题。以下是我如何重现这个问题的: 我在eclipse中有一个空的java项目。我已经在我的项目中添加了ivy.xml: 这工作正常,ivy能够解决和下载口水。 如果我将修订版更改为6.3.0.Final(http://mvnrepository.com/artifact/org.drools/drools-core/6.3.0.Final),它将不起作用,我看

  • 我正试图将我的JSF应用程序迁移到CDI。我已经暗示了以下变化: null deploymentException:WELD-001409类型[EagerBeansRepository]在注入点[[BakedAnnotatedField]@inject private org.omnifaces.applicationListener.EagerBeansRepository]具有限定符[@def