【发布时间】:2018-03-13 15:16:59
【问题描述】:
我需要做的是使用拦截器非常简单,但我真的希望有一个基于注释的更优雅的解决方案。问题是我的“解决方案”并没有真正起作用,我不知道为什么。也许这甚至是不可能的。
我的基本堆栈是: 弹簧靴 1.4.1:
- spring-boot-starter-web
- spring-boot-starter-aop
- spring-boot-starter-jdbc
- spring-boot-starter-cache
spring-beans 4.3.4 以及各种其他实用程序和测试 jar。
我有几个扩展抽象控制器的控制器。这个抽象控制器必须准备一个连接,然后每个控制器都使用自己的特定实现放在 acquire() 方法中。有时,一些 cron 作业会达到此端点。我们想对一些控制器/作业进行审计,但不一定是全部。 所以我在考虑在应该审计的地方添加一个自定义注释。
public abstract class ImportController {
@RequestMapping(value = "/checkout", method = RequestMethod.GET, produces = "application/json")
public String importEntities() {
//some code here ....
MyResult result = acquire(param);
//some code again ....
}
public abstract MyResult acquire(MyParam param)
}
需要审核的实施:
@RestController
@RequestMapping(value = "/cars")
public class CarsImportController extends ImportController {
@Override
@MyJobAudit // <--- this should add a pointcut used for Audit logging
public MyResult acquire(MyParam param) {
//cars specific code
}
}
不需要审计的实现
@RestController
@RequestMapping(value = "/tomatoes")
public class TomatoesImportController extends ImportController {
@Override
//no audit annotation
public MyResult acquire(MyParam param) {
//tomatoes specific code
}
}
我的 JobAudit 注释:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyJobAudit {
}
和方面类:
@Aspect
@Component
public class SystemAspectArchitecture {
@Pointcut("@annotation(MyJobAudit)")
public void auditableJob() {
}
}
我尝试将我的注释放在各种服务类上并且它有效。但不是在 acquire() 方法上。这里肯定有问题。我不知道是什么...
【问题讨论】:
-
你能确认你的
acquire()方法真的是public吗?因为 Spring Aspects 仅适用于公共方法。 -
是的,它是公开的
标签: java spring spring-boot aop spring-boot-starter