2011-11-30 126 views
1

我有一個Groovy類,MyRequest,用於處理每個HTTP請求。在構造函數中,此類將實例變量_session設置爲request.getSession(true)(其中request是當前的HttpServletRequest)的值。在類中設置Groovlet會話對象?

在我的Groovy 腳本中,我所做的第一件事是創建一個MyRequest的實例。其次,我檢查Groovlet對象的特定屬性。隨着我對腳本的第一次請求,這個session對象爲空,所以我得到一個空對象引用錯誤。對腳本的第二個請求session對象已定義,並且不會發生錯誤。

按照Groovlet documentation,這種情況應該可以預料,因爲我沒有明確設置的Groovlet的session對象在我腳本其生存確認之後。

我真的不想再添加一個粘貼代碼到我的腳本(以及項目中的任何未來版本)。這是我創建MyRequest對象的原因之一 - 爲任何實例化腳本的腳本定義session對象。那麼,如何在MyRequest類中爲我的Groovy腳本定義session對象?我能以某種方式使用metaClass對象嗎?

回答

0

Groovlets爲您提供開箱即用的會話範圍,無需request.getSession()。

如果從你的腳本,你這樣做:

new MyRequest(session) 

然後給出一個草率,無類型MyRequest類,像這樣:

class MyRequest { 
    def _session 
    MyRequest(sess) { 
     _session = sess 
    } 

    def nullSafe() { 
     if(_sess?.notExist) // do something... 
    } 
} 

MyRequest方法可以參考會話安全(前提是你使用Groovy空安全(?)運營商)。我已經離開了Groovlets,但是當我在滾動我自己的時候,Groovy的大師建議在將會話,請求,響應等從腳本範圍傳遞到對象時使用Thread本地...

+0

因爲我已經傳入了HttpServletRequest I也希望避免在會話中傳遞。我想這不得不工作。謝謝。 –

+0

對不起,我不得不接受答案。我沒有充分考慮它就接受了它。這個答案並不能真正解決我試圖避免的問題 - 在我寫在我的項目中的每個腳本中初始化會話對象。 –

+0

@jsumners沒有問題,我有同樣的問題,但通過讓網關腳本通過groovlet會話,請求,響應等來解決它的目標對象。如果您有多個腳本,則可能需要擴展GroeyyServlet,並通過MOP將會話注入到「MyRequest」類中​​。還可以使用missingMethod,PropertyAccessInterceptor或其他MOP工具來獲取/設置會話狀態。看看Grails,會話被注入到控制器中。事實上,爲什麼你不使用Grails,對於你的用例太重了? – virtualeyes