0

我在 src/groovy 有课程。我想在这里使用我的服务。但发生错误“没有绑定到线程的休眠会话,并且配置不允许在此处创建非事务性会话”。我尝试调试但找不到。你能帮我看看我的错误是什么吗?

class ListenerSession implements HttpSessionListener  {
    def transactionService = new TransactionService ()
    public ListenerSession() {
    }
    public void sessionCreated(HttpSessionEvent sessionEvent){
    }
    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
        HttpSession session = sessionEvent.getSession();
        User user=session["user"]
        if(user){
            try{
                java.util.Date date = session['loginDate']
                transactionService.updateUserLastLogin(user,date)
-----}catch (Exception e) {
                println e
    }

服务代码是:

def updateUserLastLogin(User user,Date date){
        try{
            User.withTransaction{
                println "121212"
                user.lastLogin=date
                user.loginDuration=new Date().time - user?.lastLogin?.time
                def x=user.save()
            }
        }catch (Exception e) {
            println e
        }
    }
4

2 回答 2

2

不要使用new. 如果他们使用几乎任何 Grails 框架,那么该部分将无法工作 - 在这种情况下就像 GORM 会话一样。

这正是您的问题: http: //grails.1312388.n4.nabble.com/Injecting-Grails-service-into-HttpSessionListener-can-it-be-done-td1379074.html

用伯特的回答:

ApplicationContext ctx = (ApplicationContext)ServletContextHolder.
  getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
transactionService = (TransactionService) ctx.getBean("transactionService")
于 2012-12-06T10:54:52.007 回答
1

Grails 不会在 src/groovy 级别为您注入您的服务,并且仅声明一个新实例TransactionService不会为您提供所有好处(因此您的错误)。你需要让你的实例形成这样的spring上下文......

  import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
  import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA

  class ListenerSession implements HttpSessionListener  {

        public ListenerSession() {
        }
        public void sessionCreated(HttpSessionEvent sessionEvent){
        }
        public void sessionDestroyed(HttpSessionEvent sessionEvent) {
            HttpSession session = sessionEvent.getSession();
            User user=session["user"]
            if(user){
                try{
                    java.util.Date date = session['loginDate']
                    def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
                    def transactionService = ctx.transactionService
                    transactionService.updateUserLastLogin(user,date)
                 }catch (Exception e) {
                    println e
                 }
             }
       }
 }
于 2012-12-06T10:56:55.070 回答