在系统运行正常的情况下
为了添加日志记录功能:采用aop进行在某个切入点加入日志,记录日志需要用到用户的一些信息,因此采用ThreadLocal方案将Struts2的Action对象中的Session属性添加到ThreadLocal当中(session属性在实现SessionAare接口后由Struts注入)
具体作法为:配置切入点在...Action的setSession(Map..)之中,配置切入逻辑.
具体运行时切入逻辑中的调试信息正常打印出来,但是随后在action的处理方法里出现了NullPointerException,说明Service对象没有被注入成功,将AOP功能去掉之后,程序又恢复正常.
很明显是Spring的AOP拦截Struts2的自动注入后影响到了Spring对Service层对象的注入.
不知道是否有哪位大哥遇到过类似的问题,或者知道其中原由,望众位大大们不吝赐教,小弟感激不尽.在线等答案.

解决方案 »

  1.   

    。感觉你的做法不太对劲啊 ThreadLocal你是怎么使用的?
      

  2.   

    问题不在ThreadLocal,即使ThreadLocal部分暂时不实现只要拦截了setSession方法,那么setXxxService方法就会被Spring注入了.
      

  3.   

    问题不在ThreadLocal,即使ThreadLocal部分暂时不实现只要拦截了setSession方法,那么setXxxService方法就不(上面掉了个不字)会被Spring注入了.
      

  4.   

    另外action对象的创建是交给struts2-spring-plugin-2.1.8.1.jar来管理的.
    其中action包中有个BaseAction,里面继承了SessionAware接口,所有真正用到的Action类全部从BaseAction继承.
    又作了一些实验:
    1.如果拦截BaseAction的话,会拦截到其中的setSession方法
    2.但是如果直接拦截BaseAction的某个子类(即由插件管理的)的话,不会拦截到setSession方法
    3.在情况2下,把切入点语法改成拦截所有方法的话,同样拦截不到任何一个方法.
    是不是由"插件"管理起来的action无法进行aop拦截.
    是不是直接拦截父类对象后,会影响到spring对"插件"所管理起来的那些action对象的注入操作.
      

  5.   

    我也遇到过这样的问题;
    解决方法:
        将定义在Action中的Service对象名设置与类同名,例:ExampleService exampleService;
    这样就可以自动注入,不报出NullPointerException;可能是因为添加aop后,注入方法只能通过识别名称来查找类。