Grails在Service类中获得Session和Management

时间:2011-08-15 07:36:34

标签: session grails service nullpointerexception httpsession

我的Grails Session有问题。我正在考虑为我的会话处理提供服务类。所以我创建了一个名为“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:“ Method抛出'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”?

希望得到你的帮助。

非常感谢你。

干杯,

5 个答案:

答案 0 :(得分:32)

您必须执行类似

的操作
def session = RequestContextHolder.currentRequestAttributes().getSession()

在您的每项服务方法中。但我不清楚为什么你需要这样的服务。您可以像这样在控制器中访问会话......

session.someAttribute = "someValue"

基督教

答案 1 :(得分:17)

下面是一些示例代码,我将拉取会话数据并从服务请求数据,而不将请求或会话对象作为参数传递给服务。

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)
    }
}

答案 2 :(得分:9)

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

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

....
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest
HttpSession session = request.session

答案 3 :(得分:0)

在更高版本(在Grails 2.5.0中测试)中,您可以直接从服务中执行getSession(true):

def myServiceMethod() {
    def session = getSession(true)
    ...
}

答案 4 :(得分:0)

这也有效

import grails.web.api.ServletAttributes

@Transactional
class AuthService implements ServletAttributes {

   // session will be available