2011-04-06 139 views
0

我正在重構一個GWT應用程序和管道在Guice刪除一些在我們的web.xml中開發的cruft。我使用guice來映射由GWT客戶端代碼調用的RPC服務。粗略地遵循這裏概述的方法。 http://stuffthathappens.com/blog/2009/09/14/guice-with-gwt/GWT,Guice ServletModule和GWT RPC問題與servlet.init()

該方法需要遠離擴展RemoteServiceServlet,但也意味着我不再能夠訪問通常通過ServletApi提供的init(),shutdown()和destroy()方法。

對於我們開發的大多數服務來說,這並不是問題,但有一種情況我偶然發現我們服務中的代碼片段依賴於使用init()來創建一個傳入引用的對象到servlet並啓動一個線程,該線程調用servlet類中的方法來輪詢服務並維護可供GWT服務使用的緩存。請參閱下面的代碼(爲了清晰起見縮短)

public class MyServiceImpl extends RemoteServiceServlet implements MyService{ 

     private CacheRefresh cr = null; 

    public void init(ServletConfig servletConfig){ 
     super.init(servletConfig); 
     cr = new CachRefresh(servletContext, this) ; 
     cr.start(); 
    } 

    public String someMethod(){ .. } 
} 

public class CacheRefresh extends Thread{ 
     public CacheRefresh(ServletContext context, MyServiceImpl servlet){ 
      ...  
     }  

     public void run(){ 
     context.setAttribute("A_MAP_KEY", servlet.someMethod())  
     } 
} 

我明白,以這種方式使用線程也可能不是一個好主意。這是我繼承的代碼,我會在適當的時候繞過去做更好的事情。

有沒有人有如何解決這個好主意?我能想到的唯一選擇是保留它,並通過web.xml文件中的映射進行配置。我不喜歡這樣的想法:在大量的地方進行配置,像散落的灰塵一樣散落在周圍。

歡迎任何建議。

編輯 - 我們使用的吉斯2.0

回答

0

這是一個古老的線程,但爲後人的緣故,類似的問題包含我認爲你正在尋找的答案:GWT RPC GWTTestCase + GUICE 2.0

即(摘自大多威爾在上述問題的答案),在那裏您配置ServletModule,您可以添加:

serve("/myapp/yourservice").with(YourServiceImpl.class); 

,然後離開你的GWT-RPC類幾乎原樣,只是增加了一些註釋吉斯:

@Singleton 
public class YourServiceImpl extends RemoteServiceServlet implements YourService { 

    private Provider<SimpleDao> daoProvider; 
    private OtherGuiceManagedObj obj; 

    @Inject 
    public YourServiceImpl(Provider<SimpleDao> daoProvider, OtherGuiceManagedObj obj) { 
     this.daoProvider = daoProvider; 
     this.obj = obj; 
    } 

    // ... RPC method implementations 
} 

但是,你仍然需要與@RemoteServiceRelativePath註釋你的服務接口聲明覆制服務的路徑,但是這是沒有比web.xml差。 (你也許可以寫一些東西來掃描與@RemoteServiceRelativePath註解服務接口的特定路徑,並添加吉斯的servlet在啓動時調用serve().with(),但也許不值得的麻煩。)

@RemoteServiceRelativePath("yourservice") 
public interface YourService extends RemoteService { 
    // ... 
} 

我之前,它這樣做按預期工作,注入Guice,等等。