CDI可以将标准库POJO注入EJB吗?

Dav*_*idS 6 java ejb cdi

我可以将自己的POJO注入到这样的托管对象中:

import javax.ejb.Stateless;
import javax.inject.Inject;
@Stateless
public class SomeEjb {
    @Inject
    private SomePojo somePojo;
}
Run Code Online (Sandbox Code Playgroud)

我有这个POJO:

// No annotations
public class SomePojo {   
}
Run Code Online (Sandbox Code Playgroud)

这很好用.如果我将EJB注入JSF支持bean,我可以看到值somePojo是非空值,如预期的那样.

但是,如果我尝试注入java.util.DateSomeEjb,我得到部署以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

SomeEjb现在:

// No annotations
public class SomeEjb {
    @Inject
    private Date date;    
}
Run Code Online (Sandbox Code Playgroud)

Date有一个公共的,无参数的构造函数,我认为所有CDI都需要"满足依赖".我确信这种行为是"规范",但显然我对CDI的理解存在很大漏洞.

有人可以解释为什么这不起作用?什么之间的区别SomePojo,并java.util.Date从CDI的角度?

语境:

  • Java EE 6
  • GlassFish 3.1.2.2
  • 我没有这方面的用例.我知道我可以指定new Date().

roe*_*ijn 4

我也可以使用 EAP 6.3 重现这一点。

该问题很可能是由于使用 Java EE 6 导致的。java.util.Date 位于 rt.jar 中,并且此 JAR 不包含启用 CDI 的 beans.xml 文件。您只能从包含 beans.xml 的 JAR 中注入对象。

常见的解决方法是使用生产者方法来注入此类对象。您必须自己编写此生成器,但您将能够从任意类注入对象,无论它们属于哪个 JAR。

据我所知,Java EE 7 中的行为发生了变化,其中 beans.xml 在某些情况下是可选的: https: //blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java

希望有帮助。

  • EE7 不会改变这种特殊情况下的行为。使用 CDI 1.1,它将自动发现带有 bean 定义注释的 bean(请参阅规范的第 12.4 节 Bean Discovery)。Date没有bean定义注解(如@RequestScoped) (2认同)