问题描述
鉴于:
- 我使用 Weld 作为我的底层 CDI 框架实现。
- 我有一个没有无参数构造函数的 ClassWithoutControl 类(即不是有效的 Bean)。
- 我为该类创建了一个自定义 Bean。
- 当触发 AfterBeanDiscovery 事件时,我通过扩展添加此 bean。
- 当在这个 bean 上调用 create(CreationalContext ctx) 时,我构造了一个 ClassWithoutControl 类的新实例。
- 我为该自定义 Bean 创建了一组注入点。
- 其中一个注入点是 ClassWithControl 的字段。
如何确保 CDI 将注入 InjectionPoint 所需类型的实例?
换句话说,我如何为一个我无法控制的类构造一个自定义 bean,这样我仍然可以将一个我可以控制的类的实例注入特定字段?
我当前的(非功能性)代码如下所示:
void afterBeanDiscovery(@Observes AfterBeanDiscovery abd,BeanManager beanManager) {
final AnnotatedType<ClassWithoutControl> annotatedType = beanManager.createAnnotatedType(ClassWithoutControl.class);
AnnotatedField<ClassWithoutControl> annotatedField = null;
for (AnnotatedField<? super ClassWithoutControl> field : annotatedType.getFields()) {
if ("field".equals(field.getJavaMember().getName()) && ClassWithControl.class.equals(field.getJavaMember().getType())) {
annotatedField = (AnnotatedField<ClassWithoutControl>) field;
break;
}
}
final InjectionPoint injectionPoint = beanManager.createInjectionPoint(annotatedField);
final HashSet<InjectionPoint> injectionPoints = new HashSet<>();
injectionPoints.add(injectionPoint);
BiFunction<CreationalContext<ClassWithoutControl>,Bean<ClassWithoutControl>,ClassWithoutControl> creator = (creationalContext,bean) -> {
final InjectionTarget<ClassWithoutControl> injectionTarget = beanManager.createInjectionTarget(annotatedType);
ClassWithoutControl instance = new ClassWithoutControl(this.paramater1,this.parameter2);
injectionTarget.inject(instance,creationalContext);
injectionTarget.postConstruct(instance);
return instance;
};
customBeanBuilder.setInjectionPoints(injectionPoints).setCreator(creator);
final BeanAttributes<ClassWithoutControl> beanAttributes = beanManager.createBeanAttributes(annotatedType);
customBeanBuilder.setBeanAttributes(beanAttributes);
abd.addBean(customBeanBuilder.build());
}
CustomBeanBuilder 是一个类,它创建一个扩展 Bean 的 CustomBean 实例。 在 CustomBean 的 create(CreationalContext ctx) 函数中调用创建者 BiFunction。 创建者的参数是传递给 create() 的 CreationalContext 和 CustomBean (this)。
我知道为什么上述方法不起作用。 Weld 返回 NonProducibleInjectionTarget,因为weld 用来创建InjectionTarget 的AnnotatedType 没有无参数构造函数。 然而,我正在寻找一种方法,我可以做到这一点,而不必依赖于 Weld 的内部实现。 我找不到一种方法来欺骗 CDI 接受我的 ClassWithoutControl 实例,同时重新训练注入另一个实例的能力。
我看过 https://docs.jboss.org/weld/reference/latest/en-US/html_single/#_wrapping_an_injectiontarget 但我不太明白如何创建这样的包装器。因此,我们也将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)