在系统运行正常的情况下
为了添加日志记录功能:采用aop进行在某个切入点加入日志,记录日志需要用到用户的一些信息,因此采用ThreadLocal方案将Struts2的Action对象中的Session属性添加到ThreadLocal当中(session属性在实现SessionAare接口后由Struts注入)
具体作法为:配置切入点在...Action的setSession(Map..)之中,配置切入逻辑.
具体运行时切入逻辑中的调试信息正常打印出来,但是随后在action的处理方法里出现了NullPointerException,说明Service对象没有被注入成功,将AOP功能去掉之后,程序又恢复正常.
很明显是Spring的AOP拦截Struts2的自动注入后影响到了Spring对Service层对象的注入.
不知道是否有哪位大哥遇到过类似的问题,或者知道其中原由,望众位大大们不吝赐教,小弟感激不尽.在线等答案.
为了添加日志记录功能:采用aop进行在某个切入点加入日志,记录日志需要用到用户的一些信息,因此采用ThreadLocal方案将Struts2的Action对象中的Session属性添加到ThreadLocal当中(session属性在实现SessionAare接口后由Struts注入)
具体作法为:配置切入点在...Action的setSession(Map..)之中,配置切入逻辑.
具体运行时切入逻辑中的调试信息正常打印出来,但是随后在action的处理方法里出现了NullPointerException,说明Service对象没有被注入成功,将AOP功能去掉之后,程序又恢复正常.
很明显是Spring的AOP拦截Struts2的自动注入后影响到了Spring对Service层对象的注入.
不知道是否有哪位大哥遇到过类似的问题,或者知道其中原由,望众位大大们不吝赐教,小弟感激不尽.在线等答案.
其中action包中有个BaseAction,里面继承了SessionAware接口,所有真正用到的Action类全部从BaseAction继承.
又作了一些实验:
1.如果拦截BaseAction的话,会拦截到其中的setSession方法
2.但是如果直接拦截BaseAction的某个子类(即由插件管理的)的话,不会拦截到setSession方法
3.在情况2下,把切入点语法改成拦截所有方法的话,同样拦截不到任何一个方法.
是不是由"插件"管理起来的action无法进行aop拦截.
是不是直接拦截父类对象后,会影响到spring对"插件"所管理起来的那些action对象的注入操作.
解决方法:
将定义在Action中的Service对象名设置与类同名,例:ExampleService exampleService;
这样就可以自动注入,不报出NullPointerException;可能是因为添加aop后,注入方法只能通过识别名称来查找类。