当前位置: 首页 > 知识库问答 >
问题:

如何为MongoDb调用注入spring aop建议?

那谦
2023-03-14

我是Spring Aop的新手,但我有理由为mongo db调用(monog db更新)实现Aop建议。我尝试了不同的方法,但得到了'point cut not wood formed‘错误或'warning与此类型名称不匹配:arg string[xlint:invalidAbsoluteTypeName]'(即使我给出了参数的绝对名称)。任何人都可以在这方面提供帮助,因为如何为mongo db更新调用注入建议?

@Aspect
@Component
public class DBStatsLoggerAspect {
    private static final Logger log = LoggerFactory
            .getLogger(DBStatsLoggerAspect.class);

    private static final Document reqStatsCmdBson = new Document(
            "getLastRequestStatistics", 1);

    private DbCallback<Document> requestStatsDbCallback = new DbCallback<Document>() {

        @Override
        public Document doInDB(MongoDatabase db) throws MongoException,
                DataAccessException {
            return db.runCommand(reqStatsCmdBson);
        }
    };

    @After("execution( public * com.mongodb.client.MongoCollection.*(..)) && args(org.bson.conversions.Bson.filter,..)")
    public void requestStatsLoggerAdvice(JoinPoint joinPoint) {
        MongoTemplate mongoTemplate = (MongoTemplate) joinPoint.getTarget();

        log.info(mongoTemplate.execute(requestStatsDbCallback).toJson());
    }

}

我需要注入建议的实际db调用方法:(filter和updatePart都是org.bson.conversions.bson数据类型),这里的“collection”是com.mongodb.client.mongoCollection.Collection

  Document result = collection.findOneAndUpdate(filter, updatePart, new FindOneAndUpdateOptions().upsert(false));

共有1个答案

曾景龙
2023-03-14

我不是Spring或MongoDB用户,只是一个AOP专家。但从我所看到的来看,我想知道:

>

  • 您正在拦截执行(public*com.mongodb.client.mongoCollection.*(..)),因此joinpoint.gettarget()mongoCollection类型。为什么您认为可以将其强制转换为MongoTemplate?只有当MongoCollection碰巧是MongoTemplate子类时,这种方法才有效。对我来说,这看起来像一个虫子。

    MongoCollection不是Spring组件,而是第三方类。Spring AOP只能通过为这些组件创建动态代理并向所述代理添加方面拦截器来拦截Spring组件调用。因此,无论你的切入点有多正确或不正确,它都不应该触发。

  •  类似资料:
    • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。

    • 本文向大家介绍SpringAOP中的注解配置详解,包括了SpringAOP中的注解配置详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringAOP中的注解配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用注解实现SpringAOP的功能: 例子: xml配置:注意给例子中使用的其他的类上面也使用注解 注意:<aop

    • 问题内容: 我想对用Apache CXF编写的RESTful接口进行单元测试。 我使用ServletContext来加载一些资源,所以我有: 如果我将其部署在Glassfish上,则会注入ServletContext,并且它会按预期工作。但是我不知道如何将ServletContext注入我的服务类中,以便可以使用JUnit测试对其进行测试。 我使用Spring 3.0,JUnit 4,CXF 2.

    • 主要内容:读者,前提条件,Spring AOP 概述Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。 读者 本教程主要是为Spring 面向方面编程(AOP)初学者准备的,帮助他们了解与Spring的AOP框架相关的基础到高级概念。 前提条件 在开始练习本教程系列文章中给出的各种类型的示例之前,我们假设您已经了解

    • 如何从代码entityTypes中注释如下: http://services.odata.org/odata/odata.svc/$metadata? Thanx。