Session Grails在服务类中获取会话和管理

Session Grails在服务类中获取会话和管理,session,grails,service,nullpointerexception,httpsession,Session,Grails,Service,Nullpointerexception,Httpsession,我对Grails会话有问题。我在考虑为我的会话处理提供一个服务类。因此,我创建了一个名为“SessionService”的类(在grails app/services/grails/下) 现在的问题是,我得到了一个Nullpointer异常:“方法抛出了'java.lang.NullPointerException'异常。无法计算org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession.ToString() 使用我的服务类别,例如在

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

现在的问题是,我得到了一个Nullpointer异常:“方法抛出了'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

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

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

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)
    }
}
对于Grails的新版本(>2.2):

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

....
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest
HttpSession session = request.session
这同样有效

import grails.web.api.ServletAttributes

@Transactional
class AuthService implements ServletAttributes {

   // session will be available

嗨,克里斯蒂安,谢谢。但是在currentRequestAttributes上没有可用的“getSession()”方法。直接执行“会话操作(设置/获取)”可能容易出错,我希望避免将会话变量命名和处理保持在一个位置;-)您是如何检查getSession()不可用的?我在grails控制台中尝试了这段代码,它成功了。哦,我不得不道歉,它成功了。但我的IntelliJ强调指出,这种方法并不存在:-O而且在每个文档中都不可用。只有旧的谷歌结果显示了这个解决方案。我不确定这在将来是否有效?!我很惊讶:-O我的解决方案是:ServletRequestAttributes ServletRequestAttributes=(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();返回servletRequestAttributes.getRequest().getSession(true);它不在接口中,但在Grails实现类中,因此IDE不清楚它是否可用,但它是可用的,并且可以安全使用。请参阅我的答案
WebUtils.retrieveGrailsWebRequest()。session
是一个非常优雅的解决方案。太棒了!如何发现WebUtils类?导入grails 3.3中未找到的org.codehaus.groovy.grails.web.util.WebUtils?
import grails.web.api.ServletAttributes

@Transactional
class AuthService implements ServletAttributes {

   // session will be available