diff --git a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/common/bean/Knife4jDocketAutoRegistry.java b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/common/bean/Knife4jDocketAutoRegistry.java index 6296c9e3875637c479c5ebfbf107e2799a401b50..7e0cb448e53892b03a577ec648e8f5df281fb87d 100644 --- a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/common/bean/Knife4jDocketAutoRegistry.java +++ b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/common/bean/Knife4jDocketAutoRegistry.java @@ -115,7 +115,7 @@ public class Knife4jDocketAutoRegistry implements BeanFactoryAware, Initializing } else if (docketInfo.getApiRule() == ApiRuleEnums.ANNOTATION) { // 替换shortName List annotationClass = AnnotationClassEnums.resolveResources(docketInfo.getApiRuleResources()); - apiPredicate = RequestHandlerSelectorUtils.multipleAnnotations(annotationClass); + apiPredicate = RequestHandlerSelectorUtils.multipleAnnotations(annotationClass, docketInfo.isApiRuleAnnoUseAnd()); } } if (CollectionUtils.isNotEmpty(docketInfo.getPathRuleResources())) { diff --git a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/model/docket/Knife4jDocketInfo.java b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/model/docket/Knife4jDocketInfo.java index 736dcabd66d6017dd682de9f4cb0987791c73f11..ea8e6f15a8e437a8097e059cf73e38ba3770edc7 100644 --- a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/model/docket/Knife4jDocketInfo.java +++ b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/model/docket/Knife4jDocketInfo.java @@ -41,7 +41,12 @@ public class Knife4jDocketInfo { * Apis strategy */ private ApiRuleEnums apiRule = ApiRuleEnums.PACKAGE; - + + /** + * Using AND operation when the strategy of apiRule is ANNOTATION, default false(or) + */ + private boolean apiRuleAnnoUseAnd = Boolean.FALSE; + /** * The resource set corresponding to the grouping policy with Api Strategy */ diff --git a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/util/RequestHandlerSelectorUtils.java b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/util/RequestHandlerSelectorUtils.java index 854b54b660eb2720f259a14cf3707988d97cec7d..b6680e8bb87ad46a8813e6a4704a1b0fc8aa933e 100644 --- a/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/util/RequestHandlerSelectorUtils.java +++ b/knife4j/knife4j-openapi2-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/spring/util/RequestHandlerSelectorUtils.java @@ -150,6 +150,16 @@ public class RequestHandlerSelectorUtils { * @return */ public static Predicate multipleAnnotations(List annotations) { + return multipleAnnotations(annotations, false); + } + + /** + * 基于注解 + * @param annotations 注解类 + * @since + * @return + */ + public static Predicate multipleAnnotations(List annotations, boolean apiRuleAnnoUseAnd) { if (annotations == null || annotations.size() == 0) { return RequestHandlerSelectors.none(); } @@ -159,21 +169,10 @@ public class RequestHandlerSelectorUtils { for (String annotationClassName : annotations) { try { Class clazz = (Class) ClassUtils.forName(annotationClassName, classLoader); - if (clazz != null) { - if (first == null) { - if (annotationClassName.equalsIgnoreCase(AnnotationClassEnums.Api.getFullPath())) { - first = RequestHandlerSelectors.withClassAnnotation(clazz); - } else { - first = RequestHandlerSelectors.withMethodAnnotation(clazz); - } - } else { - if (annotationClassName.equalsIgnoreCase(AnnotationClassEnums.Api.getFullPath())) { - first = first.or(RequestHandlerSelectors.withClassAnnotation(clazz)); - } else { - first = first.or(RequestHandlerSelectors.withMethodAnnotation(clazz)); - } - } - } + Predicate present = annotationClassName.equalsIgnoreCase(AnnotationClassEnums.Api.getFullPath()) + ? RequestHandlerSelectors.withClassAnnotation(clazz) + : RequestHandlerSelectors.withMethodAnnotation(clazz); + first = null == first ? present : apiRuleAnnoUseAnd ? first.and(present) : first.or(present); } catch (Exception e) { log.warn("Cannot handle annotation type '" + annotationClassName + "' correctly, please make sure the path is correct,message:" + e.getMessage()); }