CDI生产者和注入

5
我可以帮助您进行翻译。以下是您需要翻译的内容:

我希望在我的应用程序中使用一个生产者,但我卡在了注入bean的点上。我遇到了著名的WELD-001409错误。请帮我更好地理解CDI生产者。

这是我的接口:

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

the bean:

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 - rdcrng
1个回答

5
  1. 你的EmailMessageSender类实现了MessageSender接口,因此可以使用EmailMessageSenderMessageSender类型进行注入。

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

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

由于第一条和第二条,你有两个与单个注入点匹配的bean,因此存在歧义依赖。

总之,在上面的示例中,你的生产者是完全没有意义的(除了导致错误),因为它只是返回一个EmailMessageSender的新实例,这与简单地使用@Inject MessageSender相同,因为EmailMessageSender具有默认作用域@Dependent


啊...谢谢你澄清了这个问题。我应该把教程看完的。 - VWeber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接