2009-06-04 111 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。永遠不要*像那樣手動管理你的資源。這是破壞應用程序的祕訣。

*除了也許在測試代碼