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();
    }

}

今、私は豆を注入しています:

@Inject 
MessageSender messageSender;

プロジェクトをデプロイしようとすると、WELD-001409 エラーが発生し、Eclipse も複数の注入ポイントがあると言っています。

明示的な命名で機能します。

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

この命名は必要ですか?

4

1 に答える 1

5
  1. あなたのEmailMessageSenderクラスは実装しているため、タイプまたはMessageSenderのいずれかで注入できる Bean です。EmailMessageSenderMessageSender

  2. プロデューサーは、タイプ の Bean を返しますMessageSender

  3. 注入ポイントは、アプリケーション全体でタイプと修飾子が注入ポイントのタイプと修飾子と完全に一致する唯一の Bean を必要とします

1 つと 2 つから、1 つの注入ポイントに一致する 2 つの Bean があるため、これはあいまいな依存関係です。

結論として、上記の例ではプロデューサーは (エラーの原因を除いて) まったく無意味です。これは、単にsinceがデフォルトの scope を持っているEmailMessageSenderのとまったく同じ効果を持つ新しいインスタンスを返すだけだからです。@Inject MessageSenderEmailMessageSender@Dependent

于 2013-09-13T08:47:31.970 に答える