2013-09-13 3 views
5

Я хочу использовать производителя в своем приложении, но я застрял в точке, где я пытаюсь ввести компонент. im получая известную ошибку WELD-001409. пожалуйста, осветите мое понимание производителя cdi.CDI Producer and Injection

вот мой интерфейс:

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

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

+0

На боковой ноте - укажите класс исключения Java вместо специфического для реализации WELD-001409': 1. некоторые люди могут знать CDI, но не обязательно WELD, возможно, OWB; 2. Даже большинство людей, которые работают с WELD, вероятно, помнят полное и описательное имя класса исключения Java, но не загадочное и бессмысленное «WELD-001409». – rdcrng

ответ

5
  1. Ваш EmailMessageSender класс реализует MessageSender и поэтому боб для инъекции типа либо EmailMessageSender или MessageSender.

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

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

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

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

+0

Ahhh ... спасибо за это. я должен был прочитать учебник до конца. – VWeber

+0

Добро пожаловать. – rdcrng

Смежные вопросы