运用struts2+spring2.5+hibernate3.2配置aop权限实现时:()
<aop:config>

<aop:aspect id="aspectLog" ref="logAspect">
<aop:pointcut id="logpointcut" expression="execution(* com.study.jurisdiction.service.jurisdiction.*.*(..))" />
<aop:after-returning pointcut-ref="logpointcut" method="writeLogInfo" />
</aop:aspect>
</aop:config>
<bean id="logAspect" class="com.study.springAOP.log.LogAspect">
</bean>
上述配置业务层的aop所有方法切入,代码运行正常。
但是将aop切入到action层面时,<aop:pointcut id="logpointcut" expression="execution(* com.study.jurisdiction.action.jurisdiction.*.*(..))" />
出现页面form中的user.name和user.password无法映射到action中对应的User user对象。
请有经验先手给予指点

解决方案 »

  1.   

    业务层用struts2的拦截器,事务用spring的AOP,这个要分开;
      

  2.   

    雷你什么啦,struts2的ActiAuthorityInterceptor拦截器是专门用来拦截action的,别的他也拦截不了其他的;
    业务层一般都要用struts2的拦截器;
      

  3.   

    你需要拦截Action,用Struts2的拦截器啊,Aop直接拦截不到Action的,因为Action本身就是反射后生成的。Aop拦截Service是没有问题。推荐使用Struts2的拦截器来拦截Action
      

  4.   

    各位朋友,注意一点:<aop:pointcut id="logpointcut" expression="execution(* com.study.jurisdiction.action.jurisdiction.*.*(..))" /> 这样的切入方法理论上是正确的,实际应用时也正确执行了自定义的切入方法。只是页面取不到form的映射值。
    在下不才,找了struts2的相关源码读了下,也没搞清其中原理。
    5楼兄弟,"...业务层一般都要用struts2的拦截器;",拜拖,struts拦截业务层,好雷你的分层结构。业务放在action里?
      

  5.   

    你的struts2和spring怎么配的,如果用的spring的代理,那是取不到的,建议你好好跑一遍程序,看一下
      

  6.   

    在读struts2拦截器源码时,大概知道产生这个问题的原因:
    在struts2的表单数据映射到action的对象过程之前,是先执行struts2内部的默认拦截链,当然也可以显式定义,例如<interceptor-ref name ="defaultStack"/>
    注意strut2的拦截器:public String intercept(ActionInvocation actionInvocation) throws Exception ,
    当用自定义AOP方法拦截struts2的action时,虽然自定义的切入方法能正常运行,但截断了struts2默认拦截器ActionInvocation的传递,也就中断了表单数据向action内对象映射传递。初步设想解决方法:可以测试将自定义的切入类 implements Interceptor,耦合度高些,但应当能解决问题,考虑用策略模式实现降低偶合度;
    (求职中,待抽时间解决后交流,期望有兴趣和时间的朋友先研究后共享)