CDI Продюсер и Инъекция

Я хочу использовать продюсера в своем приложении, но я застрял в точке, где я пытаюсь ввести бин. я получаю знаменитую ошибку 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, и затмение также говорит о наличии нескольких точек ввода.

это работает с явным наименованием:

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

это наименование необходимо?

1 ответ

Решение
  1. Ваш EmailMessageSender реализует класс MessageSender и, следовательно, это боб доступен для инъекций с типом либо EmailMessageSender или же MessageSender,

  2. Ваш производитель возвращает боб типа MessageSender,

  3. Для вашей точки внедрения требуется единственный компонент во всем приложении, тип и квалификаторы которого точно соответствуют типу и квалификаторам точки внедрения.

Из одного и двух у вас есть 2 компонента, которые соответствуют одной точке внедрения - поэтому это неоднозначная зависимость.

Суть в том, что ваш производитель абсолютно бессмыслен (если не вызвать ошибку) в приведенном выше примере, потому что он просто возвращает новый экземпляр EmailMessageSender что такой же точный эффект, как просто @Inject MessageSender поскольку EmailMessageSender имеет область действия по умолчанию @Dependent,

Другие вопросы по тегам