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

Grails服务->;java.lang.NullPointerException:无法对null对象调用方法serviceMethod(),grails,Grails,我有src/groovy类。我想在这里使用我的服务。但出现错误“没有绑定到线程的Hibernate会话,配置不允许在此创建非事务会话”。我试图调试,但无法找到。你能帮我找出我的错误吗 class ListenerSession implements HttpSessionListener { def transactionService = new TransactionService () public ListenerSession() { } public

我有src/groovy类。我想在这里使用我的服务。但出现错误“没有绑定到线程的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
        }
    }

不要用
new
实例化服务。如果他们几乎使用任何一块Grails框架,那么这一块都不会像本例中的GORM会话那样工作

这正是你的问题:

用伯特的回答:

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

不要用
new
实例化服务。如果他们几乎使用任何一块Grails框架,那么这一块都不会像本例中的GORM会话那样工作

这正是你的问题:

用伯特的回答:

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

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

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

您应该考虑将代码写入“代码块”,以便更好地阅读。您是否已将侦听器添加到
web.xml
文件中?此外,这应该给你一些建议:你应该考虑把你的代码写入一个“代码块”,以便更好地阅读…您是否已将侦听器添加到
web.xml
文件中?此外,这应该给你一些建议: