有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ClassPathScanningCandidateComponentProvider。findCandidateComponents的类名错误

我有一个java项目,其中包含一个名为processor的spring boot应用程序。这个项目依赖于一个名为rules的项目和一个名为service的项目。每个项目都有相同的包模式——my.com.package
processorrules项目都包含用自定义注释@Condition注释的类。注释接口用@Retention(RetentionPolicy.RUNTIME)注释。当我扫描带有@Conditionfrom serviceprocessor注释的类时,如下所示

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个
如果在processorservice中扫描时,将参数scanner.findCandidateComponents更改为rules项目(my.com.package.rules)中的完整包路径,扫描器将找不到候选文件。如果我使用my.com.*作为参数,它只会在processor项目中找到候选项
我在这里看到了一个类似的问题Using ClassPathScanningCandidateComponentProvider with multiple jar files?,解决方案是将类加载器传递给组件提供者。我试着让类的类加载器进行扫描,并像这样将其传递给提供者

scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));

对我来说,这并没有改变任何结果


共 (0) 个答案