在 Spring 方面类中添加多个方法时,Aspect 类显示 NotFoundException

问题描述 投票:0回答:1

我在微服务架构中使用面向方面的编程。有一个通用模块用作其他微服务应用程序的依赖项。现在这个公共类有我的方面类,它包含使用这个公共模块的所有微服务的方面方法。现在,如果我正在运行我的一个微服务,那么方面类中不属于正在运行的微服务类的方法将显示 classNotFoundException。 我将用一个例子来解释

@After("execution(public void com.lowes.boomerang.chunkgenerator.service.sendExceptionEvent(..))")

@After("execution(public void com.rboomerang.scraper.code.website.productpage.impl.HomeDepotProductPageScraper.testAop(..))")

现在这两个方法位于我的方面类中,位于公共模块中。但是,当我运行这些微服务中的任何一个时,我们都会收到另一个方法的 classNotFoundException 异常。就像上面的例子一样,如果我运行 Product.scraper 微服务,那么 chunkgenerator 微服务将抛出错误,反之亦然。

我们可以通过任何方式将不同微服务的方法包含在公共模块中,并使用aop来运行所有这些方法而不会出现任何异常。

现在这两个方法位于我的方面类中,位于公共模块中。但是,当我运行这些微服务中的任何一个时,我们都会收到另一个方法的 classNotFoundException 异常。就像上面的例子一样,如果我运行 Product.scraper 微服务,那么 chunkgenerator 微服务将抛出错误,反之亦然。

@After("execution(public void com.lowes.boomerang.chunkgenerator.service.sendExceptionEvent(..))")

@After("execution(public void com.rboomerang.scraper.code.website.productpage.impl.HomeDepotProductPageScraper.testAop(..))")

java spring-boot microservices spring-aop spring-aspects
1个回答
0
投票

如果您的方面非常具体,以至于它们适用于像本例这样的单个类,或者仅适用于一个模块的类,那么它们首先就不属于公共模块,而是完全属于它们所针对的模块。否则,您将理所当然地遇到您所描述的问题。当然,引用一个类而您的模块没有声明对它的依赖关系,会导致该类不在所谓的“公共”模块的类路径上。实际上,其他模块应该依赖于公共模块,而不是相反。这只是糟糕的设计。

我理解创建一个单独的方面库的愿望,如果同一个库足够通用,可以应用于多个模块甚至多个应用程序。但是,您不使用完全限定的类名。

解决您问题的方法是使用通配符

*
,甚至可能是
..*
之类的东西。但这并不能修复你糟糕的设计,只是让它发挥作用。

示例:

com.*.boomerang.chunkgenerator.service.sendExceptionEvent
*..*.chunkgenerator.service.sendExceptionEvent
com.lowes.boomerang.chunkgenerator.service.sendExceptionEvent*

上面的内容使你的切入点不太精确(理论上,它们可以匹配其他类或方法),但因为使用通配符,它们不再需要类路径上的精确类。但实际上,切入点非常具体,只需将它们放入它们所属的模块中即可。它们并不“常见”。

© www.soinside.com 2019 - 2024. All rights reserved.