java - 尝试在 Spring 中将 Aspect 添加到 MongoTemplate 时出错

标签 java spring spring-data spring-aop spring-mongo

我正在尝试以这种方式向 Spring Rest Data 中的 MongoTemplate Bean 添加方面:

应用程序.java

@SpringBootApplication
@ComponentScan(basePackages = {"config"})
public class Application {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }
}

AspectConfig.java

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"aspect"})
public class AspectConfig {
}

MongAspect.java

@Component
@Aspect
public class MongoAspect {
    @AfterReturning("execution(* *.find(..)) && bean(mongoTemplate)")
    public void after(JoinPoint joinPoint) {
        String x = "aga";
    }
}

但是我收到这样的错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'designRepositoryImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.data.mongodb.core.MongoTemplate repository.design.DesignRepositoryImpl.mt; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.data.mongodb.core.MongoTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    ... 174 common frames omitted

这意味着代理 Bean 无法 Autowiring 。

有什么办法可以解决这个问题吗?因为我需要拦截所有 MongoTemplate.find 调用。

最佳答案

类 MongoTemplate 实现了两个接口(interface):MongoOperationsApplicationContextAware。一旦添加了切面,Spring 就会为该类创建一个代理,该代理将执行切面代码。默认情况下,如果一个类实现了一个接口(interface),Spring 将使用 JDK 代理,该代理仅实现这些接口(interface),而不扩展该类。因此,代理(即 Spring bean)没有 MongoTemplate 类型,而只有 MongoOperations 类型。

通过以下注释中的属性,您可以告诉 Spring,它应该使用 CGLib 创建代理,并且应该扩展该类,因此注入(inject)也适用于具有 MongoTemplate 的字段:

@EnableAspectJAutoProxy(proxyTargetClass=true) 

关于java - 尝试在 Spring 中将 Aspect 添加到 MongoTemplate 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37948257/

相关文章:

java - 从 Java 执行存储过程,而不是使用 JDBC CallableStatement

javascript - 使用ajax从外部html页面调用tomcat服务器war url

java.net.SocketException : Permission denied: connect Starting Tomcat 7 异常

java - 卷轴不出现

java - 冒泡排序代码中临时整数的作用是什么

java - 管理员和用户的访问权限

java - Spring Data MongoDB 集合聚合

java - Spring Data ManyToMany 选择查询

java - 以 Java8 声明式方式填充 Arraylist,而不是迭代地执行

java - 使用 Spring 进行字符串到字符串的映射?