diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java index 00fe8f195..c4c1c098a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsRegistrar.java @@ -410,6 +410,65 @@ protected Set getBasePackages(AnnotationMetadata importingClassMetadata) basePackages.add(ClassUtils.getPackageName(clazz)); } + if (basePackages.isEmpty()) { + // org.springframework.boot.autoconfigure.SpringBootApplication + String bootAppClassName = "org.springframework.boot.autoconfigure.SpringBootApplication"; + if (importingClassMetadata.hasAnnotation(bootAppClassName)){ + Map bootAttributes = importingClassMetadata + .getAnnotationAttributes(bootAppClassName); + for (String pkg : (String[]) bootAttributes.get("scanBasePackages")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + for (Class clazz : (Class[]) bootAttributes.get("scanBasePackageClasses")) { + basePackages.add(ClassUtils.getPackageName(clazz)); + } + } + + String componentScanClassName = "org.springframework.context.annotation.ComponentScan"; + if (importingClassMetadata.hasAnnotation(componentScanClassName)) { + Map scanAttributes = importingClassMetadata + .getAnnotationAttributes(componentScanClassName); + for (String pkg : (String[]) scanAttributes.get("value")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + for (String pkg : (String[]) scanAttributes.get("basePackages")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + for (Class clazz : (Class[]) scanAttributes.get("basePackageClasses")) { + basePackages.add(ClassUtils.getPackageName(clazz)); + } + } + + String componentScansClassName = "org.springframework.context.annotation.ComponentScans"; + if (importingClassMetadata.hasAnnotation(componentScansClassName)) { + Map componentScansAttrs = + importingClassMetadata.getAnnotationAttributes(componentScansClassName); + AnnotationAttributes[] componentScanAttributes = + (AnnotationAttributes[]) componentScansAttrs.get("value"); + for (AnnotationAttributes scanAttributes : componentScanAttributes) { + for (String pkg : (String[]) scanAttributes.get("value")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + for (String pkg : (String[]) scanAttributes.get("basePackages")) { + if (StringUtils.hasText(pkg)) { + basePackages.add(pkg); + } + } + for (Class clazz : (Class[]) scanAttributes.get("basePackageClasses")) { + basePackages.add(ClassUtils.getPackageName(clazz)); + } + } + } + } + if (basePackages.isEmpty()) { basePackages.add(ClassUtils.getPackageName(importingClassMetadata.getClassName())); }