【问题标题】:CDI Producer and InjectionCDI 生产者和注入
【发布时间】:2013-09-17 20:45:51
【问题描述】:

我想在我的应用程序中使用生产者,但我被困在我试图注入 bean 的地方。我得到了著名的 WELD-001409 错误。请加深我对cdi producer的理解。

这是我的界面:

@Named
    public interface MessageSender {
      void sendMessage();
    }

豆子:

public class EmailMessageSender implements MessageSender {

  @Override
  public void sendMessage() {
    System.out.println("Sending email message");
  }

}

和制作人:

@SessionScoped
public class MessageSenderFactory implements Serializable {

    private static final long serialVersionUID = 5269302440619391616L;

    @Produces
    public MessageSender getMessageSender() {
        return new EmailMessageSender();
    }

}

现在我正在注入 bean:

@Inject 
MessageSender messageSender;

当我尝试部署项目时,我收到 WELD-001409 错误,并且 Eclipse 还说有多个注入点。

它适用于显式命名:

@Inject @Named("messageSender")
MessageSender messageSender;

这个命名有必要吗?

【问题讨论】:

  • 附带说明 - 指定 Java 异常类而不是特定于实现的WELD-001409,因为: 1. 有些人可能知道 CDI,但不一定知道 WELD,也许是 OWB; 2. 即使是大多数使用 WELD 的人也可能会记住 Java 异常类的完整和描述性名称,但不会记得神秘无意义的WELD-001409

标签: java cdi weld


【解决方案1】:
  1. 您的EmailMessageSender 类实现了MessageSender,因此它是一个可用于注入的bean,类型为EmailMessageSenderMessageSender

  2. 您的生产者返回一个 MessageSender 类型的 bean。

  3. 您的注入点希望整个应用程序中唯一的 bean 的类型和限定符与注入点的类型和限定符完全匹配

从一到二,您有 2 个与单个注入点匹配的 bean - 因此这是一个模棱两可的依赖关系。

在上面的例子中,你的生产者绝对没有意义(除了导致错误),因为它只是返回一个新的EmailMessageSender 实例,这与简单的@Inject MessageSender 完全相同,因为EmailMessageSender 具有默认范围@Dependent

【讨论】:

  • 啊……感谢您澄清这一点。我应该把教程读到最后。
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2022-10-12
  • 1970-01-01
  • 2014-03-04
  • 2013-09-16
  • 2023-03-29
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多