ビジネスシーン:
C側に公開するインターフェースは認証が必要です ここには入力パラメータの種類がたくさんありますが、最終的に必要なのはIDの取得です もちろん、入力VOをカプセル化した人だけがどのフィールドに対応するかを知っていますID。したがって、実装する必要がある機能は、アスペクト上で異なる名前の「id」を持つ異なる VO に対応するメソッドを渡すことです。
注意点:
固定フィールドであればアノテーションに直接固定値を与えても良いですが、ここでは入力パラメータVOオブジェクトから値を取得する必要がある場合を想定しています。
コーディング:
まずアノテーションを定義します
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface KBVerify {
String id() default “";
}
ヒント: 後続のパラメーターを渡すためのフィールドもここで定義されます。
同時に、アスペクトを強化するためのアドバイス クラスを定義する必要があります。
@Slf4j
@Aspect
@Component
public class KBVerifyAdvice {
@Autowired
private XXXXService xxxxService;
/**
* 权限校验
*
* @param pjp
* @return
* @throws Throwable
*/
@Around("@annotation(com.ddmc.knowledge.config.KBVerify)")
public Object doCheckKBAccess(ProceedingJoinPoint pjp) throws Throwable {
Method objMethod = ((MethodSignature) pjp.getSignature()).getMethod();
String[] parameterNames = ((MethodSignature) pjp.getSignature()).getParameterNames();
Object[] args = pjp.getArgs();
KBVerify kbVerify = objMethod.getDeclaredAnnotation(KBVerify.class);
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(kbVerify.baseId());
StandardEvaluationContext ctx = new StandardEvaluationContext();
for (int i = 0; i < parameterNames.length; i++) {
ctx.setVariable(parameterNames[i], args[i]);
}
String id = expression.getValue(ctx).toString();
//TODO 拿到id就可以进行对应的校验了,该报错报错
// xxxxService.getById();
return pjp.proceed();
}
}
発信者:
/**
* c端接口
*
* @param searchReqVO
*/
@KBVerify(id = “#reqVO.appCode")
public SearchPageInfoResVO queryList(RequestVO reqVO) {
//…业务代码
}
ここでの spel 式は、入力パラメータのパラメータ名と同じである必要があることに注意してください。
このようにして、対応する入力パラメータをアノテーション内で動的に読み取ることができます。