java ClassPathScanningCandidateComponentProvider。findCandidateComponents的类名错误
我有一个java项目,其中包含一个名为processor
的spring boot应用程序。这个项目依赖于一个名为rules
的项目和一个名为service
的项目。每个项目都有相同的包模式——my.com.package
processor
和rules
项目都包含用自定义注释@Condition
注释的类。注释接口用@Retention(RetentionPolicy.RUNTIME)
注释。当我扫描带有@Condition
from service
或processor
注释的类时,如下所示
private ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(
false);
scanner.addIncludeFilter(new AnnotationTypeFilter(Condition.class));
for (BeanDefinition bd : scanner.findCandidateComponents("my.com")) {
try {
Class<?> c = Class.forName(bd.getBeanClassName());
Condition condition = c.getAnnotation(Condition.class);
register(condition);
} catch (ClassNotFoundException | IOException e) {
logger.error(e.getLocalizedMessage());
}
}
在processor
项目中用@Condition
注释的类具有正确的类名(my.com.package.x.Class
),但在rules
项目中用@Condition
注释的类具有不正确的完全限定类名(my.com.Class
),并且在项目中只找到5个具有注释的类名中的2个
如果在processor
或service
中扫描时,将参数scanner.findCandidateComponents
更改为rules
项目(my.com.package.rules
)中的完整包路径,扫描器将找不到候选文件。如果我使用my.com.*
作为参数,它只会在processor
项目中找到候选项
我在这里看到了一个类似的问题Using ClassPathScanningCandidateComponentProvider with multiple jar files?,解决方案是将类加载器传递给组件提供者。我试着让类的类加载器进行扫描,并像这样将其传递给提供者
scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));
对我来说,这并没有改变任何结果
共 (0) 个答案