我创建了一个带有 jar 打包的 Maven 实用程序项目,其中我实现了 EntityManager 接口(interface)来管理数据库连接和其他内容。但是当我想将它(来自另一个 Maven 项目)与 @Inject 一起使用时,它不起作用。
有没有办法指定我想要使用哪个 EntityManager 实现?
重要提示:如果我将此 EntityManager 包含在主项目中,它就可以工作。但我试图避免这种情况,因为将来我会有其他项目使用相同的数据库。
这是我的异常(exception)情况。
org.jboss.weld.exceptions.DeploymentException:WELD-001408 类型 [EntityManager] 与注入(inject)点 [[field] @Inject private com.gtwpedidos.test.CanalSurDao.em] 处带有限定符 [@Default] 的依赖关系不满足 在 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) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 在 org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 在 java.lang.Thread.run(Thread.java:695)
最佳答案
我认为正确的方法是:
第一个:使您的实用程序项目成为一个
EJB
并在这个EJB
内注入(inject)您的EntityManager
以及@PersistenceContext
注释。这样,EntityManager 将由 EJB 处理,即 EntityManager 在创建时创建,例如,创建 @Stateless bean 时创建,并在销毁 @Stateless bean 时销毁。第二:使用
@EJB
注释将实用程序 EJB
注入(inject)主项目的 EJB
粗略示例:
实用程序 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 ......
}
就我而言,我必须使用映射的命名,以便我的主项目找到已部署的 EJB
并将其注入(inject)到主项目中。
希望对你有帮助
关于java - 从其他项目注册EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046165/