Grails получает сеанс и управление в классе обслуживания

У меня проблема с сеансом 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: "Метод threw" исключение 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" в каждом методе?

Надеюсь получить от вас помощь.

Спасибо вам заблаговременно.

Приветствия,

Marco

Ответы

Ответ 1

откуда берется RequestContextHolder? Его не видно в Grails 3.3.8 (по крайней мере, в плагине)

Ответ 2

Вот пример кода, в котором я извлекаю данные сеанса и запрашиваю данные из службы, не передавая запрос или объекты сеанса в качестве параметра для службы.

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

Ответ 3

Для новых версий ( > 2.2) Grails:

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

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

Ответ 4

В более поздних версиях (проверенных в Grails 2.5.0) вы можете просто сделать getSession (true) прямо из службы:

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