我的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抛出'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”?
希望得到你的帮助。
非常感谢你。
干杯,
马
答案 0 :(得分:32)
您必须执行类似
的操作def session = RequestContextHolder.currentRequestAttributes().getSession()
在您的每项服务方法中。但我不清楚为什么你需要这样的服务。您可以像这样在控制器中访问会话......
session.someAttribute = "someValue"
基督教
答案 1 :(得分:17)
下面是一些示例代码,我将拉取会话数据并从服务请求数据,而不将请求或会话对象作为参数传递给服务。
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)
}
}
答案 2 :(得分:9)
对于Grails的新版本(> 2.2):
import org.codehaus.groovy.grails.web.util.WebUtils
....
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest
HttpSession session = request.session
答案 3 :(得分:0)
在更高版本(在Grails 2.5.0中测试)中,您可以直接从服务中执行getSession(true):
def myServiceMethod() {
def session = getSession(true)
...
}
答案 4 :(得分:0)
这也有效
import grails.web.api.ServletAttributes
@Transactional
class AuthService implements ServletAttributes {
// session will be available