Grails服务 - > java.lang.NullPointerException:无法在null对象上调用方法serviceMethod()

时间:2012-12-06 05:33:20

标签: grails

我在src / groovy中有Class。我想在这里使用我的服务。但是错误发生了“没有Hibernate会话绑定到线程,配置不允许在这里创建非事务性的”。我尝试调试但无法找到。你能帮我解决一下我的错误吗?

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
        }
    }

2 个答案:

答案 0 :(得分:2)

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

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

与Burt的回答:

ApplicationContext ctx = (ApplicationContext)ServletContextHolder.
  getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
transactionService = (TransactionService) ctx.getBean("transactionService")

答案 1 :(得分:1)

Grails不会在src / groovy级别为您注入您的服务,只是声明TransactionService的新实例不会给您所有的好处(因此您的错误)。您需要将实例形成为弹簧上下文,如此...

  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
                 }
             }
       }
 }