【问题标题】:Issues with CDI when injecting generic type : Wildfly 8.2.0.Final注入泛型类型时 CDI 的问题:Wildfly 8.2.0.Final
【发布时间】:2015-07-14 17:12:49
【问题描述】:

由于 CDI 更改,我们在 Widfly 中遇到了奇怪的注入问题。我们有接口

public interface Command<I, O> {
}

很多类都是这样实现这个接口的

public class ApproveUserRequests implements Command<ApproveUserRequestsRequest, List<String>> {
}

应用程序侦听器类喜欢获取所有可用类的列表并像这样使用注入

@Inject
private Instance<Command<I, O>> mActions;

但是,mActions 返回的实例始终为空。调试源码后发现获取所有实例列表的唯一方法是使用

@Inject
private Instance<Command<?, ?>> mActions;

我们在使用泛型类型时也遇到了注入问题,但是使用通配符类型帮助了我们。 - 查看更多信息:https://developer.jboss.org/thread/256783#sthash.1s6tuXsR.dpuf

【问题讨论】:

  • 请通过缩进 4 个空格或用反引号括起来来标记您的代码。这样一来,您就可以避免代码发布后出现错误和有趣的问题。另外你的两次注射看起来一样,第二次似乎没有什么不同?
  • 注明。第二个不同,我们使用通配符查找(?,?)。第一个使用 .
  • 通配符比以前的版本有意义。泛型中的通配符表示任何类型,因此如果您想要所有类型,则使用 anytype 泛型进行注入。我根本没有在这里看到任何奇怪的东西。预期行为
  • 没错,但是那个通配符可以让你得到任何类型,但我不明白为什么注入类型 Command 不起作用。有很多类实现 Command .注意,这曾经在 Jboss 7.1.1 中工作,它使用 CDI 规范 1.1 和旧版本的 WELD。我不确定 Wildfly 8.2.0.Final 中新版本的 WELD 和 CDI 1.2 发生了什么变化
  • 您的问题缺少上下文:Instance&lt;Command&lt;I,O&gt;&gt; 带有未绑定的类型变量甚至无法编译。

标签: jboss cdi wildfly wildfly-8 weld


【解决方案1】:

参数化类型的规则已在 CDI 1.2 中阐明。看看Section 5.2.4 Assignability of raw and parameterized types的规范。

【讨论】:

  • 您能否在答案中添加一些修复上述问题的代码?
  • 我认为docs.jboss.org/cdi/spec/1.2/cdi-spec.html#assignable_parameters 提供了一些信息。在我的情况下,所需的类型参数是类型变量 (I) 和 (O),bean 类型参数是实际类型 ApproveUserRequestsRequest、List。根据规范注入是不可能的,不满足第 5.2.4 节中提到的五个条件中的任何一个。更改为通配符“?”,“?”成功了。注意在这种情况下 rawtypes 是 Command 类
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2015-04-25
  • 2015-12-12
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多