![](/img/trans.png)
[英]Canot call set method on a object that's proxied with Cglib2AopProxy
[英]Spring application has Cglib2AopProxy warnings
在開始我的應用程序時,我收到了許多警告, osaop.framework.Cglib2AopProxy 'Unable to proxy method [public final void org.springframework.jdbc.core.support.JdbcDaoSupport.setDataSource(javax.sql.DataSource)] because it is final: All calls to this method via a proxy will be routed directly to the proxy.'
大約十幾個功能。
現在我完全理解基於代理的方面不能應用於最終方法。 但是,我沒有(至少是故意的)嘗試將任何方面編織到JdbcDaoSupport
。 我懷疑它來自<tx:annotation-driven />
。 我可以采取哪些措施來消除這些警告,或者更好的是,將這些類別排除在編織方面?
這很可能是由@Transactional
注釋引起的,Spring將DAO包裝在代理中以添加事務行為。
我建議讓你的DAO實現一個接口( 為你的DAO創建和使用一個接口 ),這將允許Spring使用JDK動態代理而不必使用CGLib。
使用CGLIB有一個限制,即無法建議在目標類中標記為final的方法,因為無法覆蓋最終方法(CGLIB在運行時創建目標類的子類),但在使用JDK動態代理的情況下,此限制將消失。
也許您已經擴展了JdbcDaoSupport
並添加了@Transactional
注釋。
您可以將Cglib2AopProxy
記錄器設置為日志級別ERROR以避免警告消息。 例如,如果使用log4j和log4j.properties:
log.logger.org.springframework.aop.framework.Cglib2AopProxy = ERROR
您應該使用接口進行依賴注入, 這里和此處描述了最常見的原因。
您可以閱讀有關代理機制的文檔,了解您看到此警告的詳細信息。
並且請投票支持IntelliJ的檢查的功能請求,這可以幫助我們避免這個警告。 BTW它還包含一個很好的解釋。
Spring Boot現在默認使用CGLIB代理,包括AOP支持。 如果需要基於接口的代理,則需要將spring.aop.proxy-target-class設置為false。
spring.aop.proxy目標級=假
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.