Session Grails在服务类中获取会话和管理
我对Grails会话有问题。我在考虑为我的会话处理提供一个服务类。因此,我创建了一个名为“SessionService”的类(在grails app/services/grails/下) 现在的问题是,我得到了一个Nullpointer异常:“方法抛出了'java.lang.NullPointerException'异常。无法计算org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession.ToString() 使用我的服务类别,例如在控制器中: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() 使用我的服务类别,例如在
class SampleController {
SessionService sessionService
def selectAnything = {
sessionService.setTestvar("test-value")
render(view: "testview")
}
}
我做错了什么?这条路对吗?或者我必须在每个方法中设置“session=request.session”
希望能得到你的帮助
事先非常感谢
干杯
MarcoRequestContextHolder来自哪里?它在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