问题描述
我用ProxyFactoryBean代理business层,通过strut2action来执行business对象的方法,business对象IOC到action中。执行发现每次action的方法也被代理了,并且business代理被执行了多次,我并没有对action进行任何代理,不知道什么原因,请高人指点一下!这是action:publicclassUserAction{privateUserManageruserManager;publicUserManagergetUserManager(){returnuserManager;}publicvoidsetUserManager(UserManageruserManager){this.userManager=userManager;}publicStringexecuteList(){ActionContextctx=ActionContext.getContext();/*this.userManager.setUserInfo((UserInfo)ctx.getSession().get("user"));this.userManager.setOperatorId("***************123***************");*/this.userManager.userList();return"success";}}这是business层:publicinterfaceUserManager{publicListuserList();publicvoiduserAdd();}publicclassUserManagerImplimplementsUserManager{privateStringOperatorId;privateUserInfouserInfo;publicvoidsetOperatorId(StringOperatorId){this.OperatorId=OperatorId;}publicStringgetOperatorId(){returnthis.OperatorId;}publicvoidsetUserInfo(UserInfouserInfo){this.userInfo=userInfo;}publicUserInfogetUserInfo(){returnthis.userInfo;}publicListuserList(){//this.OperatorId="***********123****************";System.out.println("************userlist************");returnnull;}publicvoiduserAdd(){}}这是通知:publicclassSecurityCheckAdviceimplementsMethodInterceptor{publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{//Servicebusiness=(Service)invocation.getThis();System.out.println("operatorId==");System.out.println("(被调用方法接口类名:"+invocation.getMethod().getDeclaringClass().getName()+")");System.out.println("(被调用方法名:"+invocation.getMethod().getName()+")");returninvocation.proceed();}}这是配置文件:<beanid="userManagerImpl"class="jn.rbac.sys.user.business.UserManagerImpl"scope="prototype"><!--collaboratorsandconfigurationforthisbeangohere--></bean><beanid="userAction"class="jn.rbac.sys.user.action.UserAction"scope="prototype"><propertyname="userManager"ref="userManager"/></bean><!--advisor--><beanid="theSecurityCheckAdvice"class="jn.rbac.security.SecurityCheckAdvice"></bean><!--permissionaroundadvisor--><beanid="securityCheckAdvice"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><propertyname="advice"><reflocal="theSecurityCheckAdvice"/></property><propertyname="pattern"><value>.*user.*</value></property></bean><beanid="userManager"class="org.springframework.aop.framework.ProxyFactoryBean"><propertyname="proxyInterfaces"><value>jn.rbac.sys.user.business.UserManager</value></property><propertyname="target"><reflocal="userManagerImpl"/></property><propertyname="interceptorNames"><list><value>securityCheckAdvice</value></list></property></bean>这是输出结果:operatorId==(被调用方法接口类名:jn.rbac.sys.user.action.UserAction)(被调用方法名:executeList)operatorId==(被调用方法接口类名:jn.rbac.sys.user.business.UserManager)(被调用方法名:userList)operatorId==(被调用方法接口类名:jn.rbac.sys.user.business.UserManager)(被调用方法名:userList)operatorId==(被调用方法接口类名:jn.rbac.sys.user.business.UserManager)(被调用方法名:userList)从结果上看aop被执行了4次,第一次代理了action,后面三次代理了business层对象,我认为正确的结果应该是只输出一次,只代理userManager接口。请高手指点!!!
解决方案
解决方案二:
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶!
解决方案三:
道行浅,不明白
解决方案四:
正在看 过两天看看能回答不.
解决方案五:
这个挺明显的。<!--permissionaroundadvisor--><beanid="securityCheckAdvice"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><propertyname="advice"><reflocal="theSecurityCheckAdvice"/></property><propertyname="pattern"><value>.*user.*</value></property></bean>
解决方案六:
关于action被代理的情况,我发现是正则表达式写的有问题,把action的方法也包括进去了,struts的action代理可能自动引用了我定义的通知。改掉正则之后第一个AOP执行就去掉了。另外后面那三次是什么原因,怎么会重复执行的?请高人指点!!!
解决方案七:
应该是这个调用了三次/*this.userManager.setUserInfo((UserInfo)ctx.getSession().get("user"));this.userManager.setOperatorId("***************123***************");*/this.userManager.userList();
解决方案八:
回楼上,上面两行是注释!
解决方案九:
我当然知道是注释了,只是怀疑你那log会不会在注释之前执行的(怀疑你注释之后没有重新编译,如果这样你在浪费大家时间)。说真的这个解决办法很简单。你自己debug下或打下当前调用栈,结果马上就出来了。如果找到原因之后请告诉下大家、
解决方案十:
已经两年不来csdn,突然上来下,现在赚点分都这么难~。楼主,赶紧给下分~。