Spel은 동적 입력 매개변수를 얻기 위해 사용자 지정 주석을 구현합니다.

비즈니스 현장:

c-side로 열린 인터페이스는 인증을 받아야 한다 여기에는 많은 종류의 입력 매개변수가 있지만 궁극적으로 필요한 것은 id를 얻는 것이다 물론 입력 VO를 캡슐화한 사람만이 어떤 필드가 ID. 따라서 구현해야 할 기능은 aspect에서 다른 이름의 "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) {

    //…业务代码

}

여기서 철자 표현식은 입력 매개변수의 매개변수 이름과 동일해야 합니다.

이러한 방식으로 해당 입력 매개변수를 주석에서 동적으로 읽을 수 있습니다.

Guess you like

Origin blog.csdn.net/qq_23974323/article/details/127916611