CDI制作人和注射
我想在我的应用程序中使用一个生产者,但我陷入了困境,我正在尝试注入bean。我得到了着名的WELD-001409错误。请减轻我对cdi制作人的理解。
i want to use a producer in my application but i'm stuck at the point, where i'm trying to inject the bean. im getting the famous WELD-001409 error. please lighten up my understanding of cdi producer.
这是我的界面:
@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也在说有多个注入点。
when i'm trying to deploy the project i get the WELD-001409 error and eclipse also is saying that there are multiple injection points.
它适用于显式命名:
@Inject @Named("messageSender")
MessageSender messageSender;
这个命名是否必要?
-
您的
EmailMessageSender
类实现MessageSender
因此它是一个可用于注入的bean,类型为EmailMessageSender
或MessageSender
。
Your
EmailMessageSender
class implementsMessageSender
and therefore it is a bean available for injection with type eitherEmailMessageSender
orMessageSender
.
您的生产者返回一个类型为的消息来源
。
Your producer returns a bean of type MessageSender
.
您的注入点需要整个应用程序中唯一的bean,其类型和限定符与注入点的类型和限定符完全匹配。
从一个和两个你有两个匹配单个注入点的bean - 因此这是一个模糊的依赖。
From one and two you have 2 beans that match a single injection point - therefore that's an ambiguous dependency.
底线,你的生产者在上面的例子中绝对没有意义(除了导致错误)因为它只返回 EmailMessageSender
的新实例,这与 @Inject MessageSender ,因为 EmailMessageSender
的默认范围 @Dependent
。
Bottom line, your producer is absolutely pointless (aside from causing the error) in the above example because it simply returns a new instance of EmailMessageSender
which is the same exact effect as simply @Inject MessageSender
since EmailMessageSender
has the default scope @Dependent
.