【8.0】【scanner】更新资源扫描会自动读取类上的标识

pull/57/head
fengshuonan 2023-07-07 18:27:35 +08:00
parent 89479ba270
commit 4ca60ba625
1 changed files with 54 additions and 9 deletions

View File

@ -26,6 +26,7 @@ package cn.stylefeng.roses.kernel.scanner;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.net.NetUtil; import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.rule.enums.ResBizTypeEnum; import cn.stylefeng.roses.kernel.rule.enums.ResBizTypeEnum;
@ -234,26 +235,27 @@ public class ApiResourceScanner implements BeanPostProcessor {
// 如果没有填写code则用"模块名称_方法名称"为默认的标识 // 如果没有填写code则用"模块名称_方法名称"为默认的标识
String code = invokeAnnotationMethod(apiResource, "code", String.class); String code = invokeAnnotationMethod(apiResource, "code", String.class);
if (StrUtil.isEmpty(code)) { if (StrUtil.isEmpty(code)) {
resourceDefinition.setResourceCode(resourceDefinition.getAppCode() + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(modular) + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(method.getName())); resourceDefinition.setResourceCode(
resourceDefinition.getAppCode() + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(
modular) + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(method.getName()));
} else { } else {
resourceDefinition.setResourceCode(resourceDefinition.getAppCode() + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(modular) + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(code)); resourceDefinition.setResourceCode(
resourceDefinition.getAppCode() + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(
modular) + scannerProperties.getLinkSymbol() + StrUtil.toUnderlineCase(code));
} }
// 填充其他属性 // 填充其他属性
String name = invokeAnnotationMethod(apiResource, "name", String.class); String name = invokeAnnotationMethod(apiResource, "name", String.class);
String[] methodPath = invokeAnnotationMethod(apiResource, "path", String[].class); String[] methodPath = invokeAnnotationMethod(apiResource, "path", String[].class);
RequestMethod[] requestMethods = invokeAnnotationMethod(apiResource, "method", RequestMethod[].class); RequestMethod[] requestMethods = invokeAnnotationMethod(apiResource, "method", RequestMethod[].class);
Boolean requiredLogin = invokeAnnotationMethod(apiResource, "requiredLogin", Boolean.class);
Boolean requiredPermission = invokeAnnotationMethod(apiResource, "requiredPermission", Boolean.class);
String requirePermissionCode = invokeAnnotationMethod(apiResource, "requirePermissionCode", String.class);
Boolean viewFlag = invokeAnnotationMethod(apiResource, "viewFlag", Boolean.class); Boolean viewFlag = invokeAnnotationMethod(apiResource, "viewFlag", Boolean.class);
ResBizTypeEnum methodResBizType = invokeAnnotationMethod(apiResource, "resBizType", ResBizTypeEnum.class); ResBizTypeEnum methodResBizType = invokeAnnotationMethod(apiResource, "resBizType", ResBizTypeEnum.class);
resourceDefinition.setRequiredLoginFlag(requiredLogin);
resourceDefinition.setRequiredPermissionFlag(requiredPermission);
resourceDefinition.setPermissionCode(requirePermissionCode);
resourceDefinition.setResourceName(name); resourceDefinition.setResourceName(name);
// 填充权限校验标识
this.processPermissionWithParentCondition(classApiAnnotation, apiResource, resourceDefinition);
// 填充资源的业务类型 // 填充资源的业务类型
if (!methodResBizType.equals(ResBizTypeEnum.DEFAULT)) { if (!methodResBizType.equals(ResBizTypeEnum.DEFAULT)) {
resourceDefinition.setResourceBizType(methodResBizType.getCode()); resourceDefinition.setResourceBizType(methodResBizType.getCode());
@ -322,7 +324,8 @@ public class ApiResourceScanner implements BeanPostProcessor {
// 将当前参数的类型加到context中后边会用到 // 将当前参数的类型加到context中后边会用到
MetadataContext.addParamTypeMetadata(parameterContextUuid, parameterMetadata.getParamTypeEnum()); MetadataContext.addParamTypeMetadata(parameterContextUuid, parameterMetadata.getParamTypeEnum());
MetadataContext.addParameterName(parameterContextUuid, parameterMetadata.getParameterName()); MetadataContext.addParameterName(parameterContextUuid, parameterMetadata.getParameterName());
fieldMetadataLinkedHashSet.add(ClassMetadataFactory.beginCreateFieldMetadata(parameterMetadata.getParameterizedType(), parameterContextUuid)); fieldMetadataLinkedHashSet.add(
ClassMetadataFactory.beginCreateFieldMetadata(parameterMetadata.getParameterizedType(), parameterContextUuid));
MetadataContext.cleanContext(parameterContextUuid); MetadataContext.cleanContext(parameterContextUuid);
} }
resourceDefinition.setParamFieldDescriptions(fieldMetadataLinkedHashSet); resourceDefinition.setParamFieldDescriptions(fieldMetadataLinkedHashSet);
@ -411,4 +414,46 @@ public class ApiResourceScanner implements BeanPostProcessor {
throw new RuntimeException("扫描api资源时出错!"); throw new RuntimeException("扫描api资源时出错!");
} }
/**
* 77
* <p>
* classclass
*
*
* @param classApiAnnotation @ApiResource
* @param methodApiResource api
* @param resourceDefinition
* @author fengshuonan
* @since 2023/7/7 17:57
*/
private void processPermissionWithParentCondition(ApiResource classApiAnnotation, Annotation methodApiResource,
ResourceDefinition resourceDefinition) {
// 获取控制器当前方法上的配置
Boolean requiredLogin = invokeAnnotationMethod(methodApiResource, "requiredLogin", Boolean.class);
Boolean requiredPermission = invokeAnnotationMethod(methodApiResource, "requiredPermission", Boolean.class);
String requirePermissionCode = invokeAnnotationMethod(methodApiResource, "requirePermissionCode", String.class);
// 如果鉴权开关为空,但是鉴权的编码不为空,则直接打开权限校验开关
if ((requiredPermission == null || !requiredPermission) && ObjectUtil.isNotEmpty(requirePermissionCode)) {
requiredPermission = true;
}
// 如果方法上的接口注解,配置的不需要登录,则以类上整体配置的为准
if (requiredLogin == null || !requiredLogin) {
requiredLogin = classApiAnnotation.requiredLogin();
}
// 如果方法上配置的权限校验为空,则以类上的配置为准
if (requiredPermission == null || !requiredPermission) {
requiredPermission = classApiAnnotation.requiredPermission();
requirePermissionCode = classApiAnnotation.requirePermissionCode();
}
// 设置权限校验标识
resourceDefinition.setRequiredLoginFlag(requiredLogin);
resourceDefinition.setRequiredPermissionFlag(requiredPermission);
resourceDefinition.setPermissionCode(requirePermissionCode);
}
} }