我让我的Spring MVC项目与Apache Shiro一起运行,用于web和api安全性。生活很美好,直到有一天我必须进行许可检查才能获得授权。
使用@RequiresPermissions
注释要求我使用以下代码启用Spring AOP:
<bean id="annotationProxy" 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>
现在,当我按如下方式运行项目时出现错误:
[http-nio-8084-exec-66] WARN org.springframework.web.context.support.XmlWebApplicationContext - 在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建bean时出错名字&#39; myController&#39;:通过字段“myService&#39;”表达的不满意的依赖性;嵌套异常是org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean命名为&#39; myService&#39;应该是[com.service.myService]类型,但实际上是[com.sun.proxy。$ Proxy594]类型 [http-nio-8084-exec-66] ERROR org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为&#39; myController的bean时出错:通过字段&#39; myService&#39;表达的不满意依赖性;嵌套异常是org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean命名为&#39; myService&#39;应该是[com.service.myService]类型,但实际上是[com.sun.proxy。$ Proxy594]类型
请帮忙。
答案 0 :(得分:2)
您的问题并没有为实际情况提供那么多线索。但是上周我在帮助调试同事的神秘错误时,自己也曾遇到过类似的错误,这里总结了我所学到的内容。
当启用AOP时,如果你的类实现了一个接口,那么默认情况下Spring会为接口创建一个代理,而不是实际的类。
因此,我们假设您的服务类型为:
@Service
public class UserService implements Service {
// ...
}
然后将为接口Service
创建代理,如果您尝试将其注入类型为UserService
的变量或参数,例如:
public class MyServiceFacade {
@Autowired
private UserService userService;
// ...
}
这成为一个问题,因为代理的类型错误。错误消息非常混乱,因为它没有明确告诉您创建了哪种代理以及导致类型不匹配的原因。
要解决此问题,您可以在调用代码时使用该接口,也可以将AOP配置更改为使用代理的目标类,这可以通过将proxy-target-class
属性设置为true
来完成。
请参阅Proxying mechanisms上的Spring说明。
答案 1 :(得分:0)
将@EnableAspectJAutoProxy添加到@Configuration类,或在XML配置文件中启用它。
(可选)为aspectjweaver添加依赖项
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>...</version>
</dependency>
答案 2 :(得分:0)
public class UnsatisfiedDependencyException extends BeanCreationException
当bean依赖于其他bean或简单时抛出异常 bean工厂定义中未指定的属性, 虽然启用了依赖性检查。
首先,您需要检查“我的服务”。