Spring AOP进行日志管理时,日志记录Service报No Session found for current thread异常

wangwang2333 2015-05-21 03:04:11
如题,使用Spring AOP对service层进行日志记录,在日志记录类中调用dao层方法操作数据库,但是调用时一直报No Session found for current thread异常,配置文件如下,看起来好像是没有对LogService进行实物管理,导致没有注入SessionFactory,有没有人遇到过类似的情况,求指导。

<tx:advice id="utilTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="utilServiceMethods"
expression="execution(* com.wang.util.service.*Impl.*(..))" />
<aop:pointcut expression="execution(* com.wang.school.service.*Impl.*(..))"
id="logedMethods" />
<aop:advisor advice-ref="utilTxAdvice" pointcut-ref="utilServiceMethods" />
<aop:aspect id="logAspect" ref="logServiceBean">
<aop:before method="test" pointcut-ref="logedMethods" />
</aop:aspect>
</aop:config>

<bean id="logDao" class="com.wang.util.dao.LogDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="logServiceBean" class="com.gzzs.util.service.LogServiceImpl">
<property name="logDao" ref="logDao" />
</bean>

异常输出:
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978)
at com.gzzs.util.dao.BaseDaoImpl.getSession(BaseDaoImpl.java:19)
at com.gzzs.util.dao.BaseDaoImpl.get(BaseDaoImpl.java:45)
at com.gzzs.util.service.LogServiceImpl.test(LogServiceImpl.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:603)
at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:39)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:50)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy11.ifHasResumes(Unknown Source)
at com.gzzs.more.action.UserCenterAction.mgrLogin(UserCenterAction.java:650)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.gzzs.util.action.LoginInterceptor.intercept(LoginInterceptor.java:93)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
...全文
287 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangwang2333 2015-05-22
  • 打赏
  • 举报
回复
开始进行日志改造的时候给自己留了一个后备方案,就是在logService中自己进行jdbc连接,不使用框架的数据库操作。笨办法。 一直在找资料解决这个问题:通过action调用service,service调用dao可以成功,但是在配置文件中直接调用Service就会报No session found for current thread错误,这次是在<aop:aspect> 标签中ref的aspectBean,以前研究SpringSecurity时也碰到过这种情况,通过断点跟踪调试,bean依赖的dao确实注入了,dao层也有了SessionFactory对象,但是当前线程没有绑定Session。有点怀疑是不是配置文件引用bean和添加事务处理两者执行顺序的原因,但毕竟对细节不了解,只是揣测。 最后,找到了一种治标不治本的方法: 将原来获取Session的方法
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就只有自己知道了。就这样结贴了,以后找到真正原因了再看。
wangwang2333 2015-05-21
  • 打赏
  • 举报
回复
引用 7 楼 a958583880 的回复:
<bean id="logDao" class="com.wang.util.dao.LogDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="logServiceBean" class="com.gzzs.util.service.LogServiceImpl"> <property name="logDao" ref="logDao" /> </bean> 路径如果要是对的话,我就不知道了
是我发帖的时候打错了~~
a958583880 2015-05-21
  • 打赏
  • 举报
回复
<bean id="logDao" class="com.wang.util.dao.LogDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="logServiceBean" class="com.gzzs.util.service.LogServiceImpl"> <property name="logDao" ref="logDao" /> </bean> 路径如果要是对的话,我就不知道了
wangwang2333 2015-05-21
  • 打赏
  • 举报
回复
引用 4 楼 a958583880 的回复:
expression="execution(* com.wang.util.service.*Impl.*(..))" /> at com.gzzs.util.service.LogServiceImpl.test 是不是这里不对?切面没对gzzs起作用 好久没用了,不知道这样能不能用expression="execution(* com.*.util.service.*Impl.*(..))" />
卡在这找不到原因了,看了好多资料,Spring AOP的官方文档也说aspect ref的bean可以像一般bean一样使用,但是不知道为什么就是不行。
wangwang2333 2015-05-21
  • 打赏
  • 举报
回复
引用 4 楼 a958583880 的回复:
expression="execution(* com.wang.util.service.*Impl.*(..))" /> at com.gzzs.util.service.LogServiceImpl.test 是不是这里不对?切面没对gzzs起作用 好久没用了,不知道这样能不能用expression="execution(* com.*.util.service.*Impl.*(..))" />
Sorry,笔误,路径名都是对的。
a958583880 2015-05-21
  • 打赏
  • 举报
回复
expression="execution(* com.wang.util.service.*Impl.*(..))" /> at com.gzzs.util.service.LogServiceImpl.test 是不是这里不对?切面没对gzzs起作用 好久没用了,不知道这样能不能用expression="execution(* com.*.util.service.*Impl.*(..))" />
wangwang2333 2015-05-21
  • 打赏
  • 举报
回复
正常调用的事务管理是成功的,只是在原有的基础上添加aop日志记录。也只有logService调用的时候会报这个异常,另外我发现如果在logService中调用其他dao层,即使logService中的方法还没被触发,被调用的dao层都会报No Session found for current thread异常,这中间是不是涉及到类似于初始化顺序什么的原因。
wangwang2333 2015-05-21
  • 打赏
  • 举报
回复
引用 1 楼 a958583880 的回复:

<tx:advice id="utilTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
换成

<tx:annotation-driven transaction-manager="transactionManager"/>
试试
这是改为全注解式事务配置?可是我项目没用注解式,改动太大了。
a958583880 2015-05-21
  • 打赏
  • 举报
回复

<tx:advice id="utilTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
换成

<tx:annotation-driven transaction-manager="transactionManager"/>
试试

81,114

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧