2

我是 Groovy 的新手。我想在 Groovy 线程中更新会话变量。我不能放真正的代码,所以我放了示例代码。

public updatename()
    {
        println(session["firstname"]);
        Thread.start
        {
                session["firstname"] = "atul";
                println(session["firstname"]);         
        }
    }

我能够在线程外访问会话变量,但在线程内的会话中出现以下错误

“错误java.lang.IllegalStateException:未找到线程绑定请求:您是指实际Web请求之外的请求属性,还是在最初接收线程之外处理请求?如果您实际上是在Web请求中操作并且仍然收到此消息,您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。”

知道如何在线程内使用会话变量

4

2 回答 2

1

通常,您只能从 Web 请求处理线程的范围内访问会话,因为您需要请求上下文来知道要使用哪个会话。在 Grails 控制器中对属性的引用session实际上是对 GrailsgetSession()注入到类中的方法的 Groovy 风格调用,该方法从当前请求中动态获取正确的会话。

可以将对该会话的引用存储在控制器操作中的局部变量中,然后在Thread.start闭包中引用该变量:

public updatename()
{
    println(session["firstname"]);
    def theSession = session
    Thread.start
    {
            theSession["firstname"] = "atul";
            println(theSession["firstname"]);         
    }
}

但我自己没有尝试过。

于 2013-09-13T11:15:02.340 回答
0

Try adding following in web.xml

<web-app ...>
   <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
   </listener>
</web-app>

And it not works, you can make a simple DTO (POJO) and pass that to thread.

于 2013-09-13T10:18:09.227 回答