私が行う必要があるのは、インターセプタを使用するとかなりシンプルですが、アノテーションに基づいたより洗練されたソリューションを本当に望んでいました。私の "解決策"は実際には機能しませんし、私はなぜそれがわからないということです。多分、これは可能ではない。抽象コントローラを拡張するコントローラ内のメソッドのカスタム注釈
私の基本的なスタックは、次のとおりです。 春ブーツ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'であることを確認できますか? Springのアスペクトはパブリックメソッドでのみ機能するためです。 –
はい、公開です – Buzzo