요격기를 사용하면 꽤 간단하지만 주석을 기반으로 한보다 우아한 솔루션을 기대하고있었습니다. 문제는 내 "솔루션"이 실제로 작동하지 않으며 이유를 알 수 없다는 것입니다. 어쩌면 이것이 가능하지 않을 수도 있습니다.추상 컨트롤러를 확장하는 컨트롤러의 메소드에 대한 사용자 정의 주석
내 기본 스택은 다음과 같습니다 봄 부팅 1.4.1 :
- 스프링 부팅 스타터 웹
- 스프링 부팅 스타터 AOP
- 스프링 부팅 스타터 - JDBC
- 스프링 부팅 스타터 캐시
봄 콩 4.3.4 및 기타 유틸리티 및 테스트 항아리 다양한.
나는 추상 컨트롤러를 확장하는 여러 컨트롤러가 있습니다. 이 추상 컨트롤러는 연결을 준비해야하며 각 컨트롤러는 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()'메소드가 실제로'public'인지 확인할 수 있습니까? 스프링 측면은 공용 메서드에서만 작동하기 때문입니다. –
예, 공개입니다 – Buzzo