- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试以编程方式查找并注入(inject)一个 CDI 托管 bean,其中限定符包含一个类的名称(不是我要注入(inject)的类),但是我遇到的问题是我正在使用的代码查找正确的 bean 总是返回 null
.
我要注入(inject)的 bean 带有一个名为 @CQRSCommandHandler
的自定义注解。其中包含用作限定符的类的名称,bean 还实现了一个名为 CommandHandler
的接口(interface).我正在使用限定符的类实现了接口(interface) Command
.
基于我对 CDI 的有限了解,我相信为了以编程方式查找已使用 @CQRSCommandHandler
限定的正确 bean注释,我需要扩展 AnnotationLiteral
然后我可以使用 Instance
选择 bean。
@CQRSCommandHandler
的代码注释如下:
@Qualifier
@Documented
@Retention(value= RetentionPolicy.RUNTIME)
public @interface CQRSCommandHandler {
Class<? extends Command> command();
}
扩展AnnotationLiteral
的代码如下:
public class CQRSCommandHandlerQualifier extends AnnotationLiteral<CQRSCommandHandler> implements CQRSCommandHandler {
private static final long serialVersionUID = 1L;
private final Class<? extends Command> command;
public CQRSCommandHandlerQualifier(Class<? extends Command> command) {
this.command = command;
}
@Override
public Class<? extends Command> command() {
return command;
}
}
我用来使用 CDI 查找正确 bean 的代码如下:
@Inject
@Any
private Instance<CommandHandler> commandHandlerInstance;
private CommandHandler findCommandHandlerFor(Command command) {
CommandHandler commandHandler = commandHandlerInstance.select(new CQRSCommandHandlerQualifier(command.getClass())).get(); //This always returns null
return commandHandler;
}
尽管在谷歌上搜索了很多小时,我还是无法弄清楚为什么 commandHandlerInstance.select(new CQRSCommandHandlerQualifier(command.getClass())).get();
不返回已用 @CQRSCommandHandler (command = MyCommand.class)
注释的 bean 实例bean 实现了 CommandHandler
接口(interface)和MyCommand.class
实现接口(interface) Command
.
这是以编程方式查找和注入(inject)限定符包含类名的 CDI 托管 bean 的正确方法吗?如果是这样,我上面的代码哪里出错了?如果不是,实现相同最终结果的最佳方法是什么?
更新
以下代码是我尝试查找的 bean 的示例实现:
@CQRSCommandHandler(command = CreateToDoItemCommand.class)
public class CreateToDoItemCommandHandler implements CommandHandler {
@Override
public <R> Object handle(Command command) {
System.out.println("This is the CreateToDoItemCommandHandler");
return null;
}
}
以下代码是CommandHandler
的接口(interface):
public interface CommandHandler {
public <R> Object handle(Command command);
}
以下代码是我在限定符中用作参数的类的示例:
public class CreateToDoItemCommand implements Command {
private String todoId;
private String description;
public CreateToDoItemCommand(String todoId, String description) {
this.todoId = todoId;
this.description = description;
}
public String getTodoId() {
return todoId;
}
public String getDescription() {
return description;
}
}
我已经在 Eclipse 中单步执行了代码,似乎 Instance
commandHandlerInstance
的对象是null
.
更新 2
正如@redge 所建议的,我将实例化的每个步骤分开到单独的一行中,如下所示:
private CommandHandler findCommandHandlerFor(Command command) {
CQRSCommandHandlerQualifier qualifier = new CQRSCommandHandlerQualifier(command.getClass());
Instance<CommandHandler> instance = commandHandlerInstance.select(qualifier);
CommandHandler commandHandler = instance.get();
return commandHandler;
}
问题似乎出在这行代码 Instance<CommandHandler> instance = commandHandlerInstance.select(qualifier);
其中 NullPointerException
被抛出大概是因为 Instance
对象 commandHandlerInstance
是null
我在 Weld 2.0.0 SP1 附带的 GlashFish 4 上运行此代码,但我也刚刚尝试在 GlashFish 4.1 上运行相同的代码并安装了 Weld 版本 2.2.10.SP1,这是来自Maven Central 但出现同样的问题。
最佳答案
您有 GlassFish 4.1。我怀疑您是否有 beans.xml 文件,如果有,应该根据您当前的设置将其标记为 bean-discovery-mode="all"
。如果你不这样做,或者你使用 bean-discovery-mode="annotated"
那么你需要为你的每个命令添加一个 bean 定义注释,例如@ApplicationScoped
用于每个命令,以便它们可以被解析。
关于java - 如何以编程方式查找和注入(inject)限定符包含类名的 CDI 托管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29527308/
我想用 CDI 实现工厂模式。这里我们有一个商业案例示例: A client provides a string representing a type. Depending on this type
我在这里的部分问题是使用正确的词汇,所以我提前为这可能是一个简单的术语问题道歉。 假设我有一个 Person接口(interface)和 PersonBean实现该接口(interface)的类。 进
我想我了解 CDI 的工作原理,为了深入研究它,我想尝试将它与现实世界的示例一起使用。我被一件事困住了,我需要你的帮助才能让我理解。我非常感谢您在这方面的帮助。 我有自己的工作流框架,使用 Java
来自 Guice 背景,我知道可以使用范围从范围中播种对象值。 scope.seed(Key.get(SomeObject.class), someObject); 我想可以通过注册一个从 Abs
JSR-299 (CDI) 引入了资源的(不幸命名的)概念:http://docs.jboss.org/weld/reference/1.0.0/en-US/html/resources.html#d
规范说,当作用域的上下文即将被销毁时,CDI 容器会删除 SFSB。它如何准确地删除 EJB?它似乎没有调用带有@Remove 注释的方法。 @Stateful public class Custom
我有一个手动初始化的对象(遗留代码)。我想将此对象放入应用程序上下文,以使其通过 CDI 可用。 如何在不编写 CDI 扩展的情况下做到这一点? 最佳答案 使用生产者。制作一个 @Produces 您
我有一个关于在 Java EE 中拥有一个尽可能不耦合的系统的最佳实现的问题,问题是使用 CDI 事件还是 CDI 拦截器更好,显然对于安全性之类的事情来说拦截器,对于日志,例如根据具体情况的两者中的
我正在尝试做简单的事情。注塑合格String (或 File )在 CDI 中。 所以我有一个限定符: @Retention(RetentionPolicy.RUNTIME) @Target({FIE
使用 Wildfly 8.2.0.Final(我相信它使用 Weld 2.2),我在 Maven 多模块项目中用 2 个简单的类重现了这个问题。一个生成一个 javax.ws.rs.client.Cl
我正在使用 picketlink 对项目中的用户进行身份验证。我还创建了一个 @produces 注释方法,因此我可以在其他地方注入(inject)经过身份验证的用户。现在,我正在使用 envers,
是否可以在使用 new 关键字创建的类中获取 CDI bean 的实例?我们目前正在对一个旧应用程序进行一些改进,我们总是得到一个 ContextNotActiveException每次我们做 pro
我正在尝试在 WildFly 8.1.0.Final 上使用 CDI 运行 Liquibase 脚本,但出现此错误: Unsatisfied dependencies for type Resourc
在没有值的情况下使用 CDI @Named 有什么意义吗?难道这不就相当于一起使用@Qualifier和@Default吗? @Named public class GifFileEditor imp
我在 JBoss-7 环境中使用 ReastEasy,目前正在实现安全功能。我正在使用带有 SSL 连接的 HTTP Basic。添加和评估 header 参数很容易(感谢 Passing param
我正在开发一些应用程序,它由三层组成: 数据库访问层(JPA + Hibernate 作为提供者) 业务逻辑层 表示层 (JSF 2.0) 在开始之前,我已经阅读了 David Geary 和 Cay
在 CDI 中,我能够注入(inject)具有特定范围的 bean,即定义 bean 类的范围。但是,如果我创建没有任何作用域的 bean 类,并且在注入(inject)时为该 bean 赋予作用域,
我们想使用 Jglue 框架对我们的 CDI 应用程序进行单元测试。我们使用 gradle 进行构建。 我们准备了这样的东西: 1) 要测试的类: @Default public class Rate
我已经有一个 session 范围的 CDI bean,它保持当前登录的用户数据。 现在,从另一个请求范围内,我想访问这个 bean 以获取一些数据。我有一些操作要做,这取决于用户登录。这是我需要的唯
有一个包 A,并且包 A 中有一个类 MyClass。我们假设 pax-cdi+weld 已打开。 我可以在不使用@Inject和其他CDI注释的情况下获取MyClass内bundle A的BeanM
我是一名优秀的程序员,十分优秀!