当前位置: 首页 > 面试题库 >

CDI的受限仿制药

南宫森
2023-03-14
问题内容

JSR-299规范在第3.1节中规定:

如果托管bean类是泛型类型,则它必须具有范围@Dependent。如果带有参数化Bean类的托管Bean声明了@Dependent以外的任何范围,则容器将自动检测到该问题并将其视为定义错误。

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

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

做出此决定的技术原因是什么?

是否会在即将发布的CDI版本中对其进行补救?

有解决此问题的最佳实践吗?

谢谢

编辑 -我经常使用的解决方法是将通用POJO Bean注入具有所需作用域的Bean中。通常但并非总是如此。


问题答案:

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

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

应用程序中将有多少个该bean实例?

这是注射部位:

@Inject
private FavouriteChooser<String> favouriteWord;

这是另一个:

@Inject
private FavouriteChooser<Integer> favouriteNumber;

您想更改答案吗?:D

哦,这是另一个:

@Inject
private FavouriteChooser<CharSequence> favouriteLetters;

编辑。如果需要解决方案,我建议将您的通用类抽象化,并添加绑定该类型的具体子类。所以:

public abstract class MyProducer<T> {...}

@Named
@SessionScoped
public class MyStringProducer extends MyProducer<String> {}

@Named
@SessionScoped
public class MyIntegerProducer extends MyProducer<Integer> {}

这是样板,但每种类型只有三行。请记住,这可能会给您每种类型每个会话一个实例,您可能不希望这样做。



 类似资料:
  • 我是从多年使用spring和刚刚开始研究JEE7和CDI的时候来回答这个问题的。 在Spring世界中,您必须将粘贴在bean上才能将其转换为Spring bean,Spring将注入依赖项,但在CDI中,似乎没有的等效项。 null

  • 问题内容: 我使用GWT开发一个Web应用程序,尝试在其中上传文件。我的servlet工作正常。 但是当我使用DiskFileItemFactory()时,它给了我错误。 如果有人可以更正我的代码或告诉我代码中缺少什么。 错误 编辑:工作代码 问题答案: 但是从您的代码看来,您根本不需要使用RMI-为什么要使用它?您不只是要处理并将其存储在某个地方吗? 如果要存储大文件(最大32MB),请使用Bl

  • 问题内容: 我有一个HTML文件,其中有几个直接以脚本标签编写的d3图形。当我将其中一张图外包到一个外部js文件中时,我收到此消息“ NS_ERROR_DOM_BAD_URI:拒绝访问受限制的URI”。如果我使用d3.json删除读取本地json文件的代码,则错误消失。但是必须有可能在嵌入到HTML中的外部js中加载json文件,对吗? 问题答案: 我遇到了相同的错误,解决方案是将index.ht

  • 虽然我确实理解泛型的一些常见情况,但我在下面的例子中遗漏了一些东西。 我有以下课程 第4行给出了错误 显然,编译器认为不同的并不真正相等。而我的直觉告诉我,这是正确的。 如果第4行是合法的,谁能提供一个我会得到运行时错误的例子? 编辑: 为了避免混淆,我用一个具体的赋值替换了第3行中的

  • 我想通过NFC从Arduino向手机发送信息。 为此,我有一个PN532模块。我想要发送信息的方式是使用模块模拟NFC标签并从手机读取信息。我不想使用真正的NFC卡的原因是内存限制。它们中的大多数都有近800字节的内存,而内存更多的内存则比较昂贵。如果我模拟带有PN532模块的卡,我还会有一些内存限制吗? 我在文件中发现了这一点: PN532-HCE 我认为重要的是APDU字节限制。我不是NFC方

  • 问题内容: 在我的代码中,我有一个UITextField,当用户点击时会打开一个UIDatePicker,以使用户能够轻松,高效地滚动至其出生日期。显然,我们不希望UIDatePicker像当前一样向上滚动到2015年。由于这是“出生日期”输入字段,因此我还需要能够将输入限制为16岁以上。我该怎么做呢? 问题答案: 您可以使用dateByAddingUnit并从当前日期减去16年来设置datePi