如题,使用Spring AOP对service层进行日志记录,在日志记录类中调用dao层方法操作数据库,但是调用时一直报No Session found for current thread异常,配置文件如下,看起来好像是没有对LogService进行实物管理,导致没有注入SessionFactory,有没有人遇到过类似的情况,求指导。
正常调用的事务管理是成功的,只是在原有的基础上添加aop日志记录。也只有logService调用的时候会报这个异常,另外我发现如果在logService中调用其他dao层,即使logService中的方法还没被触发,被调用的dao层都会报No Session found for current thread异常,这中间是不是涉及到类似于初始化顺序什么的原因。
开始进行日志改造的时候给自己留了一个后备方案,就是在logService中自己进行jdbc连接,不使用框架的数据库操作。笨办法。
一直在找资料解决这个问题:通过action调用service,service调用dao可以成功,但是在配置文件中直接调用Service就会报No session found for current thread错误,这次是在<aop:aspect> 标签中ref的aspectBean,以前研究SpringSecurity时也碰到过这种情况,通过断点跟踪调试,bean依赖的dao确实注入了,dao层也有了SessionFactory对象,但是当前线程没有绑定Session。有点怀疑是不是配置文件引用bean和添加事务处理两者执行顺序的原因,但毕竟对细节不了解,只是揣测。
决绝办法
public Session getSession() { return sessionFactory.getCurrentSession(); }
改为
public Session getSession() { try { return sessionFactory.getCurrentSession(); } catch (Exception e) { System.out .println("Open new Session with sessionFactory.openSession() method, Remenber to close it!"); return sessionFactory.openSession(); } }
问题是使用openSession()打开新的Session需要自己手动关闭~而在哪里调用会打开新的Session就只有自己知道了。就这样结贴了,以后找到真正原因了再看。
http://bbs.csdn.net/topics/391039812