我有一个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
对象吗?
答案 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本地... ...