Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP代理不';I don’我没有按预期工作_Java_Spring_Dependency Injection_Proxy_Aspectj - Fatal编程技术网

Java Spring AOP代理不';I don’我没有按预期工作

Java Spring AOP代理不';I don’我没有按预期工作,java,spring,dependency-injection,proxy,aspectj,Java,Spring,Dependency Injection,Proxy,Aspectj,实际上,我对spring代理的行为感到困惑。我想我知道j2ee、cglib和aspectj代理机制之间的主要区别。我在配置类中启用了aspectj自动代理,并且aspectj包含在类路径中 我的配置 @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) public class ApplicationConfiguration { ... } AspectJ依赖关系 <dependency>

实际上,我对spring代理的行为感到困惑。我想我知道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>
好:

到目前为止,我知道j2ee代理需要接口。但对我来说这是新的,cglib/aspectj代理不适用于实现接口的bean

有没有办法

。。。强制spring不使用j2ee代理

。。。强制spring使用cglib/aspectj代理(即使对于具有接口的类)

这是一个bug还是spring的期望行为

编辑:示例更新,
@transnational
替换为
@Validated

Edit2:解决方案:
@Validated
方法验证后处理器的影响。因此,对于这个bean,属性
proxyTargetClass
必须设置为
true

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    final MethodValidationPostProcessor methodValidationPostProcessor;
    methodValidationPostProcessor = new MethodValidationPostProcessor();
    methodValidationPostProcessor.setProxyTargetClass(true);
    return methodValidationPostProcessor;
}
注释适用于
@Aspect
注释,而不是
@Transactional
注释。为此,您需要在
@Configuration
类上使用
proxyTargetClass=true
属性值进行注释

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfiguration {
    ...
}

你说得对。我还在第二个配置类上配置了
@EnableTransactionManagement
,但没有
proxyTargetClass=true
,出于某种原因,它可以工作。请注意,这只是一个示例,在服务类上使用
@Validated
可以重现该问题。@baymon。因此,您必须将
proxyTargetClass=true
设置为该注释,让spring为
@Transactional
注释类使用CGLib代理。@baymon事实上,如果您没有使用spring AOP,您甚至不需要
@enableSpectjautoproxy
注释。要在事务上启用aspectj代理,可以使用
@EnableTransactionManagement
注释的
模式
属性。我通过比较两个项目来分析所描述的行为。我当前的项目不使用数据库,但我想使用基于代理的bean验证。。。我已经修改了我的示例,不再关注@Transactional:)。。。我的问题是在我的服务类上使用@Validated时出现的。抱歉搞混了!
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    final MethodValidationPostProcessor methodValidationPostProcessor;
    methodValidationPostProcessor = new MethodValidationPostProcessor();
    methodValidationPostProcessor.setProxyTargetClass(true);
    return methodValidationPostProcessor;
}
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableTransactionManagement(proxyTargetClass = true)
public class ApplicationConfiguration {
    ...
}