[英]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.