我正在编写一个Jersey RESTful web应用程序,尝试管理共享资源(如数据库会话)。通常我会编写以下代码:
Session session = getSession();
try {
doWork();
session.commit();
} finally {
session.rollback(); // doesn't hurt after commit
session.release(); // or whatever
}
现在使用Jersey,我有一个资源,如下所示:
@Path("/")
class MyResource {
@Path("{child}") public Child getChild(...) {
// how do I manage my session here ???
return child;
}
}
问题在于我需要在getChild()中获取session,但是我无法确保在完成工作后正确释放它,因为此时我已经将控制权归还给Web应用程序。
Child也需要访问session,因此我不能将所有工作封装在一个方法中:
class Child {
@Path("{subchild}") public Subchild getSubchild(...) {
return new Subchild(session.get(...));
}
}
我无法在servlet过滤器中包装整个应用程序,因为我需要来自Jersey级别的信息来构建我的会话。现在我可以在MyResource中打开它,使用普通的servlet过滤器确保我始终关闭它,但是我不知道何时回滚以及何时提交会话。我可以使用ExceptionMapper被通知所有异常,但那需要是一个ExceptionMapper,这似乎非常丑陋,将概念性的try/finally分布在三个具有不同生命周期的类之间。
在Jersey中是否有“正确的方法”来进行此类资源管理?如何确保我在资源及其子位置使用后正确关闭例如FileInputStream?