1

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

在我的 Groovy脚本中,我做的第一件事是创建MyRequest. session其次,我检查 Groovlet对象的特定属性。在我对脚本的第一次请求中,该session对象为空,因此我收到空对象引用错误。对脚本的第二次请求,session对象被定义并且没有发生错误。

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

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

4

1 回答 1

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 locals...

于 2011-11-30T18:26:41.247 回答