我的耳朵很简单(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,为什么我不能让所有 EJBJars 和 WAR(在 EAR 中)都可以使用的 EAR 的 lib 目录中的 Shared JAR 中拥有大量的限定符和一些生产者?
有没有办法使这项工作?
如果你真的想要——你可以在这里看到一个完整的例子: https ://github.com/fwelland/ResJect