问正式问题前先求助各位大大,为什么我在Spring的配置文件里面配置AOP以后,如果tomcat的lib和项目的lib下都有javax.servlet这个JAR包,TOMCAT就Load不进来了,但是之前我两个Lib下都有这个JAR包启动TOMCAT也不会出错,后面我配置AOP以后启动就说这个jar包load不进来,后面我把项目下的与servlet有关的JAR包都删了就行了,不知道这是为什么,很让我费解。
然后是正式问题。我配置的AOP没有对方法进行拦截。代码和配置如下,希望各位大大帮我看一下。。谢谢。。
advice代码package aop;import javax.servlet.http.HttpServletRequest;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.struts.action.ActionMapping;import edu.ujn.data.User;public class CheckRole implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable {
HttpServletRequest request = null;
ActionMapping mapping = null;
Object[] args = invocation.getArguments();
for(int i=0;i<args.length;i++) {
if(args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if(args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
}
User user =(User)request.getSession().getAttribute("user");
System.out.println("---------通知执行---------");
if(user.getLevel() != 1) {
return mapping.findForward("errorRole");
}else{
return mapping.findForward("success");
}
}}
目标对象就是一个Action我想对其execute方法进行拦截,验证当前用户有没有权限跳到指定页面。
配置文件如下:<!-- ........................AOP配置.................................... -->
<!-- 目标对象配置 -->
<bean id="SysManageActionTarget" class="edu.ujn.action.SysManageAction"/>

<!-- 切面配置 -->
<bean id="checkRoleAdvice" class="aop.CheckRole"/>
<bean id="checkRolePointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappdeName">
<value>execute</value>
</property>
<property name="advice">
<ref bean="checkRoleAdvice"/>
</property>
</bean>
<!-- 代理对象配置 -->
<bean id="SysManageAction" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<list>
<value>checkRolePointcutAdvisor</value>
</list>
</property>
<property name="target">
<ref bean="SysManageActionTarget"/>
</property>
</bean>现在的情况是没有对execute方法进行拦截。通知没有织入。刚接触AOP不知道哪出错了。

解决方案 »

  1.   

    <property name="mappdeName">写错了
      

  2.   

    谢谢wysunning我改了还是不行。我想是不是因为我的目标对象不是实现自接口,所以按上面的配置Spring不能生成代理对象的原因啊?是不是要创建CGLIB代理?如果要创建CGLIB代理应该怎么配置啊??大大们 救命~~~~
      

  3.   

    有可能是这样的。关于CGLIB实现动态代理的方式,
    1。加入CGLIB的jar;
    2.在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
      

  4.   

    哦,对了忘记了 还有正式问题前问的那个问题还没解决。。为什么我在Spring的配置文件里面配置AOP以后,如果tomcat的lib和项目的lib下都有javax.servlet这个JAR包,TOMCAT就Load不进来了,但是之前我两个Lib下都有这个JAR包启动TOMCAT也不会出错,后面我配置AOP以后启动就说这个jar包load不进来,后面我把项目下的与servlet有关的JAR包都删了就行了,不知道这是为什么,很让我费解。 
      

  5.   

    因为我要代理的那个Action目标对象已经托管给Spring而且不是单例的了,但是我在配置代理的时候目标对象指向的是一个新配的Action目标对象。这样调用的时候Spring AOP拦截的和我调用的不是一个对象,我想问题应该就出在这里。。后来我用的org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator (不知道proxyFactoryBean能不能也像这个代理生成类一样直接用name)在配置文件里面引用的托管给Spring时的那个name大概配置如下<bean id="SysManageAction" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">                      ...
                         
    <property name="beanNames">
    <list>
    <value>/systemManage</value>
    </list>
    </property>
    </bean>