【发布时间】:2013-10-17 20:59:11
【问题描述】:
我的耳朵很简单(GF 4.0,JDK 7;现在坚持使用 EE6)
耳朵包含:
EJBJar
战争
lib/Shared.jar
Shared 中有一个@Qualifier (@UserDS)(它也有 META-INF/beans.xml)。
我有一个像这样的@Producer:
package fhw.producers;
import fhw.qaulifiers.ListingDS;
import fhw.qaulifiers.UserDS;
import javax.annotation.Resource;
import javax.sql.DataSource;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;
@Default
public class DataSourceProducer
{
@Resource(lookup = "Member")
private DataSource userDS;
public DataSourceProducer()
{
System.err.println("DataSourceProducer.DataSourceProducer -- CONSTRUCTION");
}
@Produces
@UserDS
public DataSource getUserDataSource()
{
System.err.println("******DataSourceProducer.getUserDataSource; am I null? " + (null == userDS) ) ;
return userDS;
}
}
我有一个简单的 EJB(它有一个 beans.xml),它通过以下方式使用它:
@Inject
@UserDS
private DataSource userDS;
问题:当我将 DataSourceProducer 放入 EJBJAR 并部署时;我的打印语句出来了,我的@Resource 解决了,一切都很好。当我将 DataSourceProducer 放入 Shared.jar 中时;打印语句仍然出现,但 @Resource 不起作用,并且 EJB NPE 位于生产者方法返回的空 DS 上。在这两个测试中,限定符都保留在 Shared.jar 中。反正我在哪里都没有 DD(嗯,战争的 web.xml —— 其他都是隐含的)
我的一部分认为这有点道理; @Resource 有点面向 EE(或者不是?);并且应该在可部署的 EE 中最有意义。
OTOH,为什么我不能在 EAR 的 lib 目录中的 Shared JAR 中拥有所有 EJBJars 和 WAR(在 EAR 中)都可以使用的所有限定符和一些生产者?
有没有办法让它工作?
如果你真的想要——你可以在这里看到一个完整的例子:https://github.com/fwelland/ResJect
【问题讨论】:
标签: dependency-injection glassfish java-ee-6 cdi