[英]Spring AOP proxy doesn't work as expected
實際上我對彈簧代理的行為感到困惑。 我想我知道j2ee,cglib和aspectj的代理機制之間的主要區別。 我在配置類中啟用了aspectj自動代理,並且aspectj包含在類路徑中。
我的配置
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ApplicationConfiguration {
...
}
AspectJ依賴
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.5</version>
</dependency>
通過使用這個簡單的設置,我假設bean注入按預期工作。 但是我的應用程序導致IllegalArgumentException
s,其中包含“無法將[...]字段[...]設置為com.sun.proxy。$ Proxy30”的消息。 這意味着Spring使用j2ee代理服務,即使啟用了aspectj代理也是如此。
最后我發現我的服務上的接口導致了這種行為。 當我的服務實現任何接口時,似乎spring決定使用j2ee代理。 如果我刪除它們,它的工作原理。
失敗:
@Service
@Validated
public class MyService implements Interface1, Interface2 {
@override
public void methodFromInterface1() {
}
@override
public void methodFromInterface2() {
}
public void serviceMethod() {
}
}
好:
@Service
@Validated
public class MyService {
public void methodFromInterface1() {
}
public void methodFromInterface2() {
}
public void serviceMethod() {
}
}
到目前為止,我已經明白j2ee代理需要接口。 但對我來說這是新的,cglib / aspectj代理不適用於實現接口的bean。
有沒有辦法......
...強制春天不使用j2ee代理?
...強制spring使用cglib / aspectj代理(即使對於有接口的類)?
這是春天的錯誤或期望的行為嗎?
編輯 :更新示例, @Transational
替換為@Validated
EDIT2:解決方法: @Validated
受影響MethodValidationPostProcessor
。 因此,此bean的屬性proxyTargetClass
必須設置為true
。
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
final MethodValidationPostProcessor methodValidationPostProcessor;
methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setProxyTargetClass(true);
return methodValidationPostProcessor;
}
@EnableAspectJAutoProxy
注釋適用於@Aspect
注釋,而不適用於@Transactional
注釋。 為此,您需要在@Configuration
類上使用@EnableTransactionManagement
注釋,並使用proxyTargetClass = true
屬性值。
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfiguration {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.