web-dev-qa-db-ja.com

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が発生することです: "メソッドは '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」を設定する必要がありますか?

あなたからの助けを得ることを願っています。

事前にどうもありがとうございました。

乾杯、

マルコ

16
grailsInvas0r

requestContextHolderはどこから来たのですか? grails 3.3.8では表示されません(少なくともプラグインでは)

32
user852518

これは、リクエストまたはセッションオブジェクトをパラメーターとしてサービスに渡さずに、サービスからセッションデータとリクエストデータをプルするサンプルコードです。

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

Grailsの新しいバージョン(> 2.2)の場合:

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

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

それ以降のバージョン(Grails 2.5.0でテスト済み)では、サービスから直接getSession(true)を実行できます。

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