2009-06-04 112 views
3

我试图在泽西岛编写一个RESTful web应用程序时管理争用资源(如:数据库会话)。通常我会这样写代码:泽西岛JAX-RS中的异常处理/资源管理

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应用程序。

孩子需要访问会话一样,所以我不能封装在一个方法中的所有工作:

class Child { 
    @Path("{subchild}") public Subchild getSubchild(...) { 
    return new Subchild(session.get(...)); 
    } 
} 

我不能包装在一个Servlet过滤器的整个应用程序,因为我从新泽西州级需要的信息构建我的会议。现在我可以在MyResource中打开它,使用常规的servlet过滤器来确保我总是关闭它,但是我不知道何时回滚以及何时提交会话。我可以使用ExceptionMapper来通知所有的异常,但这需要是一个ExceptionMapper,这看起来非常难看,概念上的try/finally分布在三个不同生命期的类上,等等。

泽西岛有没有一种“正确的方式”来进行这种资源管理?我如何确保我能够正确关闭一个资源后的FileInputStream,它的子位置已经使用了它?

回答

0

在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; 
    } 
} 
+0

的问题是,儿童可有可能需要访问会话,过于武断子定位器。我会更新这个问题。 – 2009-06-10 09:51:45

0

Use Spring。永远不要*像那样手动管理你的资源。这是破坏应用程序的秘诀。

*除了也许在测试代码