【发布时间】:2015-09-30 05:50:43
【问题描述】:
我有一个 Jersey Web 服务,它使用 Hibernate 来做一些持久性。我已经使用 hk2 提供程序逻辑实现了 EntityManagerFactory 的创建/处置,我发现堆栈溢出,这极大地有助于保持数据库连接的数量较低。我不想强迫用户拥有一个数据库,所以我希望代码能够优雅地处理这种情况。但是,除了必须注释掉我的 @Inject 注释之外,我似乎无法弄清楚。任何人都知道如何使用自定义 @Inject 并对其进行编码以使其为空?
当 Persistence.create 失败时,我试图在 DBManager 中捕获该异常,并在我的 WebServiceClass 中检查 null。但它在@Inject 行崩溃并且没有捕获到异常。我环顾了那个 findOrCreate null 异常,发现有一个名为 supportsNullCreation() 的方法,但没有找到有关如何使用它的示例。
这是我的代码的样子:
使用 HK2 的可注入数据库提供程序:
public class DbManager
implements Factory<EntityManagerFactory>
{
private static EntityManagerFactory factory = null;
@Inject
public DbManager()
{
try
{
factory = Persistence.createEntityManagerFactory("myapp");
}
catch ( Exception eee )
{
// just means DB is not connected which I want to allow
System.out.println("No DB, that should be okay");
}
}
@Override
public EntityManagerFactory provide() {
return factory;
}
@Override
public void dispose(EntityManagerFactory emf) {
if ( emf != null && emf.isOpen() )
{
emf.close();
}
}
public EntityManagerFactory getEntityMgrFactory()
{
return factory;
}
}
然后是在 Jersey 应用程序中创建提供程序的方式:
@ApplicationPath("rest")
public class MyApplication extends ResourceConfig
{
public MyApplication()
{
....
// Provider of DB
this.register( new AbstractBinder()
{
@Override
public void configure()
{
bindFactory(DbManager.class).to(EntityManagerFactory.class).in(Singleton.class);
}
});
}
那么就是这样使用的:
@Singleton
@Path("myservice")
public class WebServiceClass
{
// NOTE: Right now I have to comment this to run without a DB
@Inject
private EntityManagerFactory entityManagerFactory = null;
...
我得到的例外是这个......
java.lang.IllegalStateException: Context
org.jvnet.hk2.internal.SingletonContext@6cae5847 findOrCreate returned a null for
descriptor SystemDescriptor(
implementation=com.db.DbManager
contracts={javax.persistence.EntityManagerFactory}
scope=javax.inject.Singleton
qualifiers={}
descriptorType=PROVIDE_METHOD
descriptorVisibility=NORMAL
metadata=
rank=0
loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@7050f2b1
proxiable=null
proxyForSameScope=null
analysisName=null
id=145
locatorId=0
identityHashCode=863132354
reified=true)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2075)
...
【问题讨论】:
-
那么在你的例子中,你是说如果 EMF 创建失败,你仍然希望它正常工作,这意味着注入将只是空的?这样做有什么好处?我理解正确吗?
-
我想问题是如果没有数据库,用户将如何与服务交互?对端点的调用返回什么?
-
是的,我希望它在 EMF 创建失败时正常工作。
-
对端点的调用会向用户返回一些数据,这些数据可能会或可能不会持久化,具体取决于数据库是否已安装和运行。
标签: hibernate jpa dependency-injection jersey jax-rs