shiro可以开启权限注解功能
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<!-- 开启Shiro注解 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
但是同时,也配置了
<aop:aspectj-autoproxy/>
那么问题就来了!
假如shiro 配置文件先执行,那么这时候 DefaultAdvisorAutoProxyCreator会生成一个jdk代理(一般没有接口),然后再执行spring配置文件,获取到bean其实是经过jdk代理的结果,并且jdk代理本身带有接口,生成的就是代理的代理,即二次代理,
那么接下来,用到的aop切面的类中,都将有问题!!
会报
must be of type [xxx], but was actually of type [com.sun.proxy.$Proxy47]
错误!
解决方法是给DefaultAdvisorAutoProxyCreator 注入proxyTargetClass属性为true
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true"/>
</bean>
二次代理的问题 其实在springmvc和mvc就有所体现了!
这问题真是找了好久,最初没想到二次代理的问题,调spring源码好久也没发现哪里不对 –! 特此记录下来!