簡體   English   中英

Spring AOP代理無法按預期工作

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

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