비즈니스 현장:
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) {
//…业务代码
}
여기서 철자 표현식은 입력 매개변수의 매개변수 이름과 동일해야 합니다.
이러한 방식으로 해당 입력 매개변수를 주석에서 동적으로 읽을 수 있습니다.