17

我对 Grails 会话有疑问。我正在考虑为我的会话处理提供一个服务类。所以我创建了一个名为“SessionService”的类(在 grails-app/services/grails/ 下)。

class SessionService {
    static transactional = true
    GrailsWebRequest request = RequestContextHolder.currentRequestAttributes()
    GrailsHttpSession session = request.session

    def setTestvar(String value) {
        if (session != null)
            session.setAttribute("sTeststring", value)
    }

    def getTestvar() {
        if (session != null)
            session.getAttribute("sTeststring")
    }
}

现在的问题是,我得到一个 Nullpointer-Exception:“方法抛出 'java.lang.NullPointerException' 异常。无法评估 org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession.ToString() ”。

我的服务类的使用,例如在控制器中:

class SampleController {

    SessionService sessionService

    def selectAnything = {

        sessionService.setTestvar("test-value")
        render(view: "testview")
    }
}

我在这里做错了什么?这是正确的方法吗?还是我必须在每个方法中设置“session = request.session”?

希望能得到你的帮助。

非常感谢您提前。

干杯,

马可

4

4 回答 4

31

RequestContextHolder 来自哪里?它在 grails 3.3.8 中不可见(至少在插件中)

于 2011-08-15T10:36:27.633 回答
19

这是一些示例代码,其中我从服务中提取会话数据和请求数据,而不将请求或会话对象作为参数传递给服务。

package beecomplete

import org.codehaus.groovy.grails.web.util.WebUtils

class HelperService {

    public User getCurrentUser() {
        def webUtils = WebUtils.retrieveGrailsWebRequest()
        return User.findById(webUtils.getSession().userid)
    }

    public Object getModelAttribute(String key) {

        def webUtils = WebUtils.retrieveGrailsWebRequest()
        return webUtils.getCurrentRequest().getAttribute(key)
    }
}
于 2012-12-03T14:01:10.333 回答
11

对于 Grails 的新版本 (>2.2):

import org.codehaus.groovy.grails.web.util.WebUtils

....
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest
HttpSession session = request.session
于 2014-10-14T13:18:18.510 回答
0

这也有效

import grails.web.api.ServletAttributes

@Transactional
class AuthService implements ServletAttributes {

   // session will be available
于 2020-05-09T05:46:07.360 回答