Java CDI可以将标准库POJO注入EJB吗?
我可以将自己的POJO注入托管对象,如下所示: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中,我可以看到
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()
希望这能有所帮助。我将在一两天后在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)。