我创建了一个带有jar包装的maven实用程序项目,我在其中实现了EntityManager接口来管理数据库连接和东西。但是当我想在@Inject中使用它(来自另一个maven项目)时它不起作用。
有没有办法指定我要使用哪个EntityManager实现?
重要说明:如果我在主项目中包含此EntityManager,它可以正常工作。但是我试图避免这种情况,因为将来我会使用同一个数据库进行其他项目。
这是我的例外。
org.jboss.weld.exceptions.DeploymentException:WELD-001408在注入点[[field] @Inject private com.gtwpedidos.test.CanalSurDao.em]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项 在org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275) 在org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244) 在org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107) 在org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127) 在org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346) 在org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331) 在org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) 在org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83) 在org.jboss.as.weld.services.WeldService.start(WeldService.java:76) at org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService(ServiceControllerImpl.java:1811) at org.jboss.msc.service.ServiceControllerImpl $ StartTask.run(ServiceControllerImpl.java:1746) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918) 在java.lang.Thread.run(Thread.java:695)
答案 0 :(得分:0)
我认为正确的做法是:
第一步:将您的实用程序项目设为EJB
,并在此EJB
内注入EntityManager
@PersistenceContext
注释。这样,EntityManager将由EJB处理,即,当@Stateless
bean被销毁时创建并销毁@Stateless
bean时,就会创建EntityManager。
第二步:使用utility EJB
注释
@EJB
粗略的例子:
UTILITY EJB
@Stateless(name="UtilityEJB", mappedName="UtilityEJBGlobal")
public class UtilityEJB
{
@PersistenceContext(unitName = "PRIMARY_PERSISTENCE_UNIT")
public EntityManager em;
//other stuff ......
}
主要项目
@Stateless
public class Main
{
@EJB(mappedName="UtilityEJBGlobal")
private UtilityEJB utilityEJB ;
//other stuff ......
}
在我的情况下,我必须使用映射的namings,以便我的主项目找到已部署的EJB
并将其注入主要项目。
希望有所帮助