【问题标题】:WELD-001562: Producer method with Generic signatureWELD-001562:具有通用签名的生产者方法
【发布时间】:2021-11-15 04:10:05
【问题描述】:

我正在使用weld 4.0,在我的一种生产者方法中,我有这个签名:

@Produces
  @ConfigurationType
  public <T extends IConfiguration> T getConfigurationInstance(InjectionPoint injectionPoint){
                <perform some logic, create an instance of class T and return>
}

目标是有几种配置。基于 ConfigurationType (Database/Server/Datasource blah, blah),返回一个特定类型的 Configuration 实例,它实现了 IConfiguration 接口,以便我可以将返回的实例以更易读的格式处理,如 JDK14 记录或其等价物。换句话说,我只想说 serverConfigurationInstance.port() 来读取端口,其中 serverConfigurationInstance 是 Produced 并由 Injector 逻辑返回的。

现在,启动时焊接容器会告诉我:

执行 Java 类时发生异常。 WELD-001562:生产者方法返回类型可能不是类型变量或组件类型为类型变量的数组类型: [错误] [EnhancedAnnotatedMethodImpl] @ConfigurationType @Produces public config.ConfigurationInjector.getConfigurationInstance(InjectionPoint) [错误] 在 config.ConfigurationInjector.getConfigurationInstance(ConfigurationInjector.java:0)

Jakarta 焊接文档 (4.0.1) 或搜索特定错误代码或消息并没有进一步引导我。我做错了什么?

【问题讨论】:

  • 下面的答案涵盖了所提出的问题。我想知道你是否正在尝试做动态制作人的东西。如果是这样,您可能会发现我关于该主题的博客文章很有帮助:lairdnelson.wordpress.com/2017/02/11/…

标签: dependency-injection cdi weld producer


【解决方案1】:

如果您查看specs,它会显示:

如果生产者方法返回类型是类型变量或组件类型是类型变量的数组类型,容器会自动检测问题并将其视为定义错误。

这是您遇到错误的原因。

规范似乎允许从生产者方法返回带有类型变量的参数化类型,只要范围是@Dependent - 这是你的情况。比如:

@Produces
@ConfigurationType
public <T extends IConfiguration> Supplier<T> getConfigurationInstance(InjectionPoint injectionPoint){
  <perform some logic, create a supplier of an instance of class T and return>
}

但是,这样一来,容器“魔法”(例如拦截)将发生在容器对象上,而不是您创建的 IConfiguration 实例上,这可能是也可能不是您想要的。

【讨论】:

  • 感谢您的回复。从多态的角度来看,我明白你在说什么。我的返回类型不固定。如果文档反映了这种观点,那么关于错误消息的声明和规范确实是一致的。但是让我感到困惑的是,我的生产者方法返回类型不是“类型变量”,而我只是说我想要一个实现 IConfiguration 接口的任何类的实例。从某种意义上说,这并不是真正意义上的变量。恕我直言,变量一词应该用于限制较少的容器。
  • 答案中提供的链接的这个特定部分使其更加混乱:(Point in Line 2, Sec 3.2, Producer Methods)要注入的对象的具体类型可能在运行时有所不同,或者
  • “要注入的对象的具体类型在运行时可能会有所不同”:假设您要生成一个实现接口的 bean。您在类路径中有几个实现,但要选择的确切一个取决于某些运行时方面,因此您无法在编译/汇编时知道。这就是第 2 点的内容。我不确定我是否理解第一条评论(抱歉)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多