簡體   English   中英

啟用S​​pring AOP時出現BeanNotOfRequiredTypeException

[英]BeanNotOfRequiredTypeException upon enabling Spring AOP

我的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]類型。

請幫忙。

您的問題並沒有為實際情況提供太多線索。 但是上周我自己曾與一個類似的錯誤作戰,同時幫助調試了一個同事的神秘錯誤,這是我所學到的總結。

啟用AOP后,如果您的類實現了接口,則Spring默認情況下將為該接口創建代理,而不是實際的類。

因此,假設您的服務類型為:

@Service
public class UserService implements Service {
  // ...
}

然后,將為接口Service創建代理,並且如果您嘗試將其注入到UserService類型的變量或參數中,例如:

public class MyServiceFacade {
  @Autowired
  private UserService userService;

  // ...
}

這是一個問題,因為代理的類型錯誤。 該錯誤消息非常混亂,因為它沒有明確告訴您已創建了哪種代理,以及為什么導致類型不匹配。

要解決此問題,您可以在調用代碼中使用接口,也可以將AOP配置更改為使用目標類作為代理,這可以通過將proxy-target-class屬性設置為true

請參閱有關代理機制的 Spring說明中的更多內容。

將@EnableAspectJAutoProxy添加到您的@Configuration類,或在XML配置文件中啟用它。

(可選)為Aspectjweaver添加依賴項

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>...</version>
</dependency> 
public class UnsatisfiedDependencyException extends BeanCreationException

當一個bean依賴於其他bean或未在bean工廠定義中指定的簡單屬性(盡管啟用了依賴檢查)時,拋出該異常。

首先,您需要檢查“ myService”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM