受限制的CDIgenerics

JSR-299规范在§3.1中说明:

如果托管bean类是generics类型,则它必须具有范围@Dependent。 如果具有参数化bean类的托管bean声明除@Dependent之外的任何作用域,则容器会自动检测问题并将其视为定义错误。

有效地意味着你不能这样做:

@Named @SessionScoped or @RequestScoped or similar public class MyProducer {...} 

这个决定的技术原因是什么?

它是否会在即将发布的CDI版本中得到补救?

是否有处理/解决此问题的最佳做法?

谢谢

编辑 – 我经常使用的解决方法是将通用POJO-bean注入到具有所需范围的bean中。 通常,但并非总是如此。

这是一个通用的非依赖bean类:

 @ApplicationScoped public class FavouriteChooser { public T getFavourite() { // ... } } 

应用程序中有多少个这样的bean实例?

这是一个注射部位:

 @Inject private FavouriteChooser favouriteWord; 

这是另一个:

 @Inject private FavouriteChooser favouriteNumber; 

你想改变你的答案吗? :d

哦,这是另一个:

 @Inject private FavouriteChooser favouriteLetters; 

编辑。 如果你想要一个解决方案,我会建议你的generics类是抽象的,并添加绑定类型的具体子类。 所以:

 public abstract class MyProducer {...} @Named @SessionScoped public class MyStringProducer extends MyProducer {} @Named @SessionScoped public class MyIntegerProducer extends MyProducer {} 

它是样板文件,但每种类型只有三行。 请记住,每个类型的每个会话可以为您提供一个实例,这可能是您不想要的。

必须代理所有非依赖范围的bean – AFAIK这对于generics类型是不可能的。

更新:

我希望能够更详细地解释这一点,但我不是;-) Weld使用javassist ,他们声明代理generics类型原则上是可行的 – 尽管顶层API不直接支持。 但我们谈的是规范,而不是焊接的实施……

也许其他人可以填补空白?