启用S​​pring AOP时BeanNotOfRequiredTypeException

时间:2018-04-02 05:46:20

标签: java spring-mvc spring-aop shiro

我让我的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]类型

请帮忙。

3 个答案:

答案 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工厂定义中未指定的属性,   虽然启用了依赖性检查。

首先,您需要检查“我的服务”。