在类中设置Groovlet会话对象?

时间:2011-11-30 14:45:35

标签: groovy groovlet

我有一个Groovy类MyRequest,用于处理每个HTTP请求。在构造函数中,此类将实例变量_session设置为request.getSession(true)的值(其中request是当前的HttpServletRequest)。

在我的Groovy 脚本中,我要做的第一件事是创建MyRequest的实例。其次,我检查Groovlet session对象的特定属性。在我对脚本的第一个请求中,这个session对象为null,因此我得到一个空对象引用错误。对脚本的第二个请求,session对象已定义,并且不会发生错误。

根据Groovlet documentation,应该预料到这种情况,因为我在脚本中检查它是否存在后没有显式设置Groovlet的session对象。

我真的不想在脚本中添加更多的粘贴代码(以及项目中的任何未来代码)。这是我创建MyRequest对象的原因之一 - 为实例化它的任何脚本定义session对象。那么,如何在session类中为我的Groovy脚本定义MyRequest对象?我可以用某种方式使用metaClass对象吗?

1 个答案:

答案 0 :(得分: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 null safe(?)运算符)。我已经离开了Groovlets,但当我自己滚动时,Groovy大师建议在将会话,请求,响应等从脚本范围传递给对象时使用Thread本地... ...