Spel は、動的な入力パラメータを取得するためのカスタム アノテーションを実装します。

ビジネスシーン:

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 式は、入力パラメータのパラメータ名と同じである必要があることに注意してください。

このようにして、対応する入力パラメータをアノテーション内で動的に読み取ることができます。

おすすめ

転載: blog.csdn.net/qq_23974323/article/details/127916611