5

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

这是我的界面:

@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;

这个命名有必要吗?

4

1 回答 1

5
  1. 您的EmailMessageSender类实现MessageSender了,因此它是一个可用于注入的 bean,类型为EmailMessageSenderor 或MessageSender

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

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

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

最重要的是,您的生产者在上面的示例中绝对没有意义(除了导致错误之外),因为它只是返回一个新实例,EmailMessageSender该实例的效果与简单@Inject MessageSender因为EmailMessageSender具有默认范围相同@Dependent

于 2013-09-13T08:47:31.970 回答