Jersey JAX-RS中的异常处理/资源管理

Jersey JAX-RS中的异常处理/资源管理,jersey,jax-rs,Jersey,Jax Rs,我试图在Jersey编写RESTful web应用程序时管理争用资源(如:数据库会话)。通常我会编写如下代码: Session session = getSession(); try { doWork(); session.commit(); } finally { session.rollback(); // doesn't hurt after commit session.release(); // or whatever } @Path("/") class MyRes

我试图在Jersey编写RESTful web应用程序时管理争用资源(如:数据库会话)。通常我会编写如下代码:

Session session = getSession();
try {
  doWork();
  session.commit();
} finally {
  session.rollback(); // doesn't hurt after commit
  session.release(); // or whatever
}
@Path("/")
class MyResource {
  @Path("{child}") public Child getChild(...) {
    // how do I manage my session here ???
    return child;
  }
}
现在在Jersey,我有这样的资源:

Session session = getSession();
try {
  doWork();
  session.commit();
} finally {
  session.rollback(); // doesn't hurt after commit
  session.release(); // or whatever
}
@Path("/")
class MyResource {
  @Path("{child}") public Child getChild(...) {
    // how do I manage my session here ???
    return child;
  }
}
问题是我需要在getChild()中获取会话,但我无法确保在工作完成后正确释放它,因为我已经将控制权交还给了web应用程序

Child也需要访问会话,因此我无法将所有工作封装在一个方法中:

class Child {
  @Path("{subchild}") public Subchild getSubchild(...) {
    return new Subchild(session.get(...));
  }
}
我无法将整个应用程序包装在servlet过滤器中,因为我需要来自Jersey级别的信息来构建会话。现在我可以在MyResource中打开它,使用常规的servlet过滤器确保我总是关闭它,但是我不知道什么时候回滚,什么时候提交会话。我可以使用ExceptionMapper来通知所有异常,但这需要一个ExceptionMapper,这看起来非常难看,概念上的尝试/最终扩展到三个具有不同生命周期的类,等等


在泽西岛有没有一种“正确的方法”来进行这种资源管理?我如何确保在资源及其子位置使用了FileInputStream之后正确关闭它?

在REST应用程序中,您不需要向调用传递任何内容。如果您在getChild中进行工作,那么所有逻辑都应该在这里。猜猜你在做什么,上面应该是:

@Path("/{childId}")
class ChildResource {  

    @GET
    public Child getChild(@PathParam("childId") String childId) {    
        //Really, move this into a data access object
        Session session = getSession();
        try {  
            doWork();  
            session.commit();
        } finally {  
            session.rollback(); 
            // doesn't hurt after commit  
            session.release(); 
            // or whatever
        }
        return child;  
    }
}
。永远不要像那样手动管理你的资源。这是一个坏的应用程序配方


*除了可能在测试代码中

之外,问题是孩子可能也有可能需要访问会话的任意子定位器。我会更新这个问题。