ユーザーが要求されているエンティティを作成したのと同じグループに属していることを確認するために、基本的な ID 比較を実行するアスペクトを作成しました。アスペクトを @Service メソッドにアタッチすることに成功しましたが、サービス レイヤーでは意味がなく、代わりに @RestController メソッドにアタッチする必要があります。これを実行しようとすると、すべて問題ないように見えますが、アスペクトがトリガーされず、ログがサイレントになります。
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
春のコンテキスト
<context:annotation-config/>
<context:component-scan base-package="my.pkg"/>
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true"/>
側面
@Aspect
@Component
public class MyAspect {
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controller() {}
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void restController() {}
@Pointcut("args(java.security.Principal,..)")
public void principalArgPointcut() {}
@Around("(controller() || restController()) && principalArgPointcut()")
public Object validate(ProceedingJoinPoint point) throws Throwable {
doValidationBefore();
Object result = point.proceed();
doValidationAfter();
return result;
}
}
「doValidationBefore()」および「doValidationAfter()」は、検証が失敗した場合に例外をスローします。
そして最後に、私の RestController
@RestController
@RequestMapping("/my-path")
public class MyController {
@RequestMapping(value = "/{entityId}", method = RequestMethod.GET)
public @ResponseBody
ResponseEntity<MyEntity> getEntityDetails(Principal principal, @PathVariable("entityId") Long entityId) {
return new ResponseEntity(HttpStatus.OK);
}
}
注意すべき点:
- サービスに合わせて実行パターンを変更し、それをサービス パッケージに配置すると、まさにこの側面が機能します。
- Aspect と RestController は同じコンテキストにあります
- 私は IDEA IDE を使用しています。アスペクトの [推奨される方法に移動] アイコンを使用すると、テストしている方法が方法のリストに表示されます。
- 「推奨される方法に移動する」にリストされている方法はどれも機能していません
私が試したこと:
- pom.xml に 3 つのライブラリを追加しました: org.aspectj:aspectjrt:1.8.6、org.aspectj:aspectjtools:1.8.6、cglib:cglib:2.2.2。これらのどれも違いはありませんでした。
- コンテキスト xml で Aspect と PointCuts を直接定義して、注釈を削除しようとしましたが、違いはありません。
- 実行パターンをすべてのメソッドに適用するように設定しようとしましたが、それでもトリガーされませんでした。
- RestController のインターフェイスを追加しようとしましたが、変更はありません。
かなり長い間これを解決しようとしてきたので、ここで助けていただければ幸いです。私はそれが可能でなければならないことを知っています。