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

时间:2015-04-22 19:10:15

标签: java ejb cdi

我可以将自己的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支持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有一个公共的,无参数的构造函数,我认为所有CDI都需要“满足依赖”。我确信这种行为是“规范”,但显然我对CDI的理解存在很大漏洞。

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

上下文:

  • Java EE 6
  • GlassFish 3.1.2.2
  • 我没有这个用例。我知道我可以指定new Date()

1 个答案:

答案 0 :(得分:3)

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

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

常见的解决方法是使用producer method来注入此类对象。你必须亲自对这个生产者进行研究,但是你可以从任意类中注入对象,无论它们属于哪个JAR。

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

希望有所帮助。