0

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
        }
    }
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すべての利点が得られません (したがって、エラーが発生します)。インスタンスを春のコンテキストから取得する必要があります...

  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 に答える