CDI 可以将标准库 POJO 注入到 EJB 中吗?
Can CDI inject standard library POJOs into an EJB?
我可以像这样将自己的 POJO 注入到托管对象中:
import javax.ejb.Stateless;
import javax.inject.Inject;
@Stateless
public class SomeEjb {
@Inject
private SomePojo somePojo;
}
我有这个 POJO:
// No annotations
public class SomePojo {
}
这很好用。如果我将 EJB 注入 JSF backing-bean,我可以看到 somePojo
的值是非空值,正如预期的那样。
但是,如果我尝试将 java.util.Date
注入 SomeEjb
,我会在部署时遇到以下异常:
Severe: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:311)
SomeEjb 现在:
// No annotations
public class SomeEjb {
@Inject
private Date date;
}
Date 有一个 public、无参数构造函数,我认为这就是 CDI "satisfy the dependency" 所需要的全部。我确定这种行为是 "to spec",但显然我对 CDI 的理解存在很大漏洞。
有人可以解释为什么这不起作用吗?从 CDI 的角度来看,SomePojo
和 java.util.Date
有什么区别?
上下文:
- Java EE 6
- GlassFish 3.1.2.2
- 我没有这方面的用例。我知道我可以指定
new Date()
.
我也可以用 EAP 6.3 重现这个。
问题很可能是由于使用 Java EE 6 而发生的。java.util.Date 位于 rt.jar 中,并且此 JAR 不包含 beans.xml 文件,该文件将启用 CDI。您只能从包含 beans.xml.
的 JAR 中注入对象
一个常见的解决方法是使用 producer method 来注入这样的对象。你必须自己写这个生产者,但你将能够从任意 类 注入对象,无论它们属于哪个 JAR。
据我所知,Java EE 7 中的行为发生了变化,其中 beans.xml 在某些情况下是可选的:https://blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java
希望对您有所帮助。
我可以像这样将自己的 POJO 注入到托管对象中:
import javax.ejb.Stateless;
import javax.inject.Inject;
@Stateless
public class SomeEjb {
@Inject
private SomePojo somePojo;
}
我有这个 POJO:
// No annotations
public class SomePojo {
}
这很好用。如果我将 EJB 注入 JSF backing-bean,我可以看到 somePojo
的值是非空值,正如预期的那样。
但是,如果我尝试将 java.util.Date
注入 SomeEjb
,我会在部署时遇到以下异常:
Severe: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Date] with qualifiers [@Default] at injection point [[field] @Inject private SomeEjb.date]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:311)
SomeEjb 现在:
// No annotations
public class SomeEjb {
@Inject
private Date date;
}
Date 有一个 public、无参数构造函数,我认为这就是 CDI "satisfy the dependency" 所需要的全部。我确定这种行为是 "to spec",但显然我对 CDI 的理解存在很大漏洞。
有人可以解释为什么这不起作用吗?从 CDI 的角度来看,SomePojo
和 java.util.Date
有什么区别?
上下文:
- Java EE 6
- GlassFish 3.1.2.2
- 我没有这方面的用例。我知道我可以指定
new Date()
.
我也可以用 EAP 6.3 重现这个。
问题很可能是由于使用 Java EE 6 而发生的。java.util.Date 位于 rt.jar 中,并且此 JAR 不包含 beans.xml 文件,该文件将启用 CDI。您只能从包含 beans.xml.
的 JAR 中注入对象一个常见的解决方法是使用 producer method 来注入这样的对象。你必须自己写这个生产者,但你将能够从任意 类 注入对象,无论它们属于哪个 JAR。
据我所知,Java EE 7 中的行为发生了变化,其中 beans.xml 在某些情况下是可选的:https://blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java
希望对您有所帮助。