我所要做的很简单,使用拦截器,但我真的希望有一个基于注释的更优雅的解决方案。问题是我的“解决方案”并没有真正起作用,我不知道为什么。也许这甚至是不可能的。
我的基本堆栈是:spring boot 1.4.1:
- spring-boot-starter-web
- spring-boot-starter-aop
- spring-boot-starter-jdbc
- spring-boot-starter-缓存
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()方法上。这里肯定有问题。我想不通是什么...