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

Java CDI可以将标准库POJO注入EJB吗?,java,ejb,cdi,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中,我可以看到

我可以将自己的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)
现在:

// No annotations
public class SomeEjb {
    @Inject
    private Date date;    
}
Date有一个公共的、无参数的构造函数,我认为这就是CDI“满足依赖性”所需要的全部内容。我确信这种行为“符合规范”,但显然我对CDI的理解有一个很大的漏洞

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

背景:

  • Java EE 6
  • 玻璃鱼3.1.2.2
  • 我没有这个用例。我知道我可以指定
    newdate()

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

这个问题最有可能是因为使用了JavaEE6。java.util.Date位于rt.jar中,这个jar不包含一个可以启用CDI的beans.xml文件。您只能从包含beans.xml的jar注入对象

一种常见的解决方法是使用注入来注入这样的对象。您必须自己编写这个生产者,但是您将能够从任意类注入对象,而不管它们属于哪个JAR

据我所知,Java EE 7中的行为发生了变化,其中beans.xml在某些情况下是可选的:


希望这能有所帮助。

我将在一两天后在Glassfish 4中试用此功能,并向您报告。谢谢。EE7不会改变这种特殊情况下的行为。在CDI1.1中,它将自动发现带有bean定义注释的bean(参见规范的第12.4节bean发现)。Date没有bean定义注释(例如@RequestScoped)@jbergmark,我找到了一个引用,引用了您在规范部分中描述的内容:“隐式bean存档是包含一个或多个bean类和bean定义注释的任何其他存档…”roehrijn引用的博文中也提到了这一点:“默认情况下,如果您不指定任何内容,并且没有beans.xml,则假定bean发现模式为‘注释’而不是‘全部’。”谢谢!我尝试了两件事,它们都奏效了:(1)添加一个
@products
方法来生成
Date
对象,以及(2)将
java.util.Date
类的副本添加到我的项目中。我意识到第二种方法很奇怪,但它满足了我的好奇心。我假设我也可以使用
beans.xml
文件重新打包
rt.jar
,然后我可以注入任何STL POJO。第一种方法是我唯一会使用的方法,但这非常有启发性。@DavidS:使用后一种方法肯定会导致很多额外的问题和异常。你是对的-只是永远不要这样做,并使用(1)。