【问题标题】:BeanNotOfRequiredTypeException upon enabling Spring AOP启用 Spring AOP 时出现 BeanNotOfRequiredTypeException
【发布时间】:2018-09-11 08:31:06
【问题描述】:

我的 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 时出错名称为“myController”:通过字段“myService”表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanNotOfRequiredTypeException:名为“myService”的 Bean 应该是 [com.service.myService] 类型,但实际上是 [com.sun.proxy.$Proxy594] 类型 [http-nio-8084-exec-66] 错误 org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“myController”的bean时出错:通过字段“myService”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanNotOfRequiredTypeException:名为“myService”的 Bean 应该是 [com.service.myService] 类型,但实际上是 [com.sun.proxy.$Proxy594] 类型

请帮忙。

【问题讨论】:

    标签: java spring-mvc spring-aop shiro


    【解决方案1】:

    您的问题并没有为实际情况提供那么多线索。但是上周我自己在帮助调试同事的神秘错误时遇到了类似的错误,这里是我学到的总结。

    启用 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 说明。

    【讨论】:

    • 错误中提到的特定类没有实现接口,它只是在被Spring扫描时似乎在顶部。我试图设置proxy-target-class,但也许我错过了如何准确地做到这一点。我只是将 :&lt;aop:config proxy-target-class="true"&gt; &lt;!-- other beans defined here... --&gt; &lt;/aop:config&gt; 粘贴到顶部的 context.xml 文件中,还是应该保留任何特定的 bean 来代替__ .
    • 好的,如果不是那么清楚,那么你必须看看你是否可以调试它。请参阅 this answer 了解有关需要注意哪些日志条目的详细信息。
    • 我已经尝试解决这个问题大约 1 天了!谷歌什么都不做,我以为我永远解决不了这个问题,谢谢,你的回答应该是使用方面之前的基本陈述之一:)
    【解决方案2】:

    将@EnableAspectJAutoProxy 添加到您的@Configuration 类,或在您的XML 配置文件中启用它。

    (可选)添加 aspectjweaver 的依赖项

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>...</version>
    </dependency> 
    

    【讨论】:

    • 添加了 和依赖。似乎没有任何改变。
    【解决方案3】:
    public class UnsatisfiedDependencyException extends BeanCreationException
    

    当一个 bean 依赖于其他 bean 或简单时抛出异常 未在 bean 工厂定义中指定的属性, 虽然启用了依赖检查。

    首先,您需要检查您的“myService”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多