如何处理继承类型的多个处理方法



我有两个类。

class A {
}
class B extends A {
}

在我的制作人课上,我这样宣称。

@Produces A produceA(InjectionPoint ip) {
return new A();
}
void disposeA(@Disposes A a) {
// empty
}
@Produces B produceB(InjectionPoint ip) {
return new B();
}
void disposeB(@Disposes B b) {
// empty
}

Weld抱怨道。

....DefinitionException: WELD-000077: Cannot declare multiple disposal methods for this producer method.
Producer method:  org.jboss.weld.bootstrap.BeanDeployer@41e68d87
Disposal methods:  
- Disposer method [[BackedAnnotatedMethod] ....Producer.disposeA(@Disposes A)],
- Disposer method [[BackedAnnotatedMethod] ....Producer.disposeB(@Disposes B)]

这正常吗?我该如何解决?

这是一个类型安全的解决方案,它按预期工作。根据规范3.4.3。处置器方法分辨率:

处理器方法绑定到生产者方法或生产者字段,如果:

  • 生产者方法或生产者字段由与处置器方法相同的bean类声明,并且
  • 根据类型安全解析中定义的类型安全解析规则(使用原始类型和参数化类型的可分配性(,生产者方法或生产者字段可分配给已处理的参数

在您的特定情况下,您有一个生产者方法produceB,它创建一个类型为{B, A, Object}的bean。类型是从返回类型派生的,将包含类型本身、所有超类和所有实现的接口(如CDI规范中所述(。

然后有两个dispuser方法,一个使用dispuser参数A,另一个使用B。如果有帮助的话,你可以把这些参数看作注入点——你的produceB生产者方法创建了一个适合这两个处理器的bean,因此产生了歧义,因为Weld每个bean最多需要一个处理器方法。

如果你想了解更多关于typesafe分辨率的工作原理,请点击此处。

至于如何"解决"这种情况,我可以从脑海中想到两种方法(可能有更多的方法可以做到这一点(:

  • 您可以在另一个bean中声明每个生产者+处置者。根据规范,dispuser需要在生产者所在的同一个bean中声明,这样就可以消除这个问题
  • 您可以在生产者上使用@Typed,并将produceB的类型限制为仅B.class,这也应该解决这种情况,但bean将不再有资格注入到任何类型为A的注入点中

最新更新