【问题标题】:CDI Extension - How to handle nonbinding values on qualifierCDI 扩展 - 如何处理限定符上的非绑定值
【发布时间】:2015-09-11 20:28:37
【问题描述】:

我目前正在开发 CDI 扩展。我必须注册一些特殊的自定义bean,这就是为什么生产者还不够。

目前这是在AfterBeanDiscovery-Phase 内通过使用abd.addBean() 方法注册Bean<> 的自定义实现来完成的。

缺点是在 bean 的 create()-method 内我无法访问 InjectionPoint,这可能在注解中包含额外的配置。

作为一种可能性,我可以在ProcessInjectionTarget 阶段收集我需要的所有bean(因为我可以访问注释)并在AfterBeanDiscovery 阶段中​​注册它们中的每一个。 然后我必须使配置注释成为限定符和限定符绑定的属性(不使用@Nonbinding)以防止模棱两可的依赖关系。

然后我将注册大量配置不同的 bean。

是否有替代解决方案?是否可以访问bean create() 方法中的InjectionPoint

谢谢!

【问题讨论】:

  • 你说生产者是不够的,但你不支持它。为什么你觉得这里的 producer 方法是不够的,它似乎完全可以做到你想要的。
  • 好的,所以你的用例有点混乱。是的,如果有人想使用自定义限定符,它会超出您的框架。通常,框架将创建带有参数的生产者,通常是字符串。 DeltaSpike 有一个很好的例子来说明这种实现,请注意使用 JPA,但这里使用了相同的想法 deltaspike.apache.org/documentation/…
  • 所以可能更具体一点(不想打扰细节):我目前正在开发一个 CDI 扩展,它允许您通过使用例如注入 Jenkins 的东西。 @JenkinsJob("JobName")。为此目的,生产者由将产生相应 JenkinsServer(例如 ServerDev)的开发人员实现。现在,开发人员应该能够使用第二个注释(限定符)来注释@JenkinsJob 注释成员,该注释用于确定要使用哪个服务器(因为他的 JenkinsServer-Producer 将具有相同的限定符)。这有帮助吗?
  • 只需对 JenkinsJob.value 使用 @Nonbinding 并提供带有 InjectionPoint 作为参数的 CDI-Producer。参见例如github.com/apache/deltaspike/blob/master/deltaspike/core/impl/…

标签: java cdi


【解决方案1】:

我想我找到了解决办法。

基本上我需要以某种方式访问​​bean create() 方法中的当前InjectionPoint,这样人们也可以访问注入点的注释。

为了获得注入点,以下代码被剪断(灵感来自OmniFaces,使用Apache Deltaspike):

public class InjectionPointGenerator {

  @Inject
  private InjectionPoint injectionPoint;

  public InjectionPoint getInjectionPoint() {
    return injectionPoint;
  }
}


public class BeanUtils {

  protected BeanUtils() {
    // Prevent instantiation
  }

  public static InjectionPoint getInjectionPoint(@Nonnull CreationalContext context) {
    Bean<InjectionPointGenerator> bean = getBean(InjectionPointGenerator.class);
    BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager();
    InjectionPoint injectionPoint = bean.getInjectionPoints().iterator().next();
    return (InjectionPoint) beanManager.getInjectableReference(injectionPoint, context);
  }

  private static <T> Bean<T> getBean(@Nonnull Class<T> type) {
    return BeanProvider.getBeanDefinitions(type, false, true).iterator().next();
  }
}

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多