【问题标题】:Grails get Session and Management in Service classGrails 在服务类中获取会话和管理
【发布时间】:2011-10-27 02:48:13
【问题描述】:

我对 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 throw '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”?

希望能得到你的帮助。

非常感谢您。

干杯,

马可

【问题讨论】:

    标签: session grails service nullpointerexception httpsession


    【解决方案1】:

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

    【讨论】:

    • 嗨克里斯蒂安,谢谢。但是 currentRequestAttributes 上没有可用的“getSession()”方法。直接执行“会话操作(设置/获取)”可能容易出错,我想避免将会话变量命名和处理保持在一个地方;-)
    • 您如何检查 getSession() 不可用?我在 grails 控制台中尝试了代码,它工作正常。
    • 哦,我必须道歉,它有效。但是我的 IntelliJ 强调它不存在这种方法:-O 同样在每个文档中它都不可用。只有 OLD google 结果显示此解决方案。我不确定这是否在未来有效?!我很惊讶:-O 我现在的解决方案是:ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); return servletRequestAttributes.getRequest().getSession(true);
    • 它不在接口中,但在 Grails 实现类中,因此 IDE 不清楚它是否可用,但它是可用的,并且可以安全使用。
    • 在新版本的 grails WebUtils 中已经实现。看我的回答stackoverflow.com/questions/7062605/…
    【解决方案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)
        }
    }
    

    【讨论】:

    • WebUtils.retrieveGrailsWebRequest().session 是一个非常优雅的解决方案。
    • 太棒了!你是如何发现 WebUtils 类的?
    • import org.codehaus.groovy.grails.web.util.WebUtils not found for grails 3.3?
    【解决方案3】:

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

    import org.codehaus.groovy.grails.web.util.WebUtils
    
    ....
    HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest
    HttpSession session = request.session
    

    【讨论】:

      【解决方案4】:

      这也有效

      import grails.web.api.ServletAttributes
      
      @Transactional
      class AuthService implements ServletAttributes {
      
         // session will be available
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多