classpathscanningcandidatecomponentprovider.findcandidatecomponents的类名错误

eoxn13cs  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(328)

我有一个java项目,其中包含一个名为 processor . 这个项目依赖于一个叫做 rules 还有一个叫做 service . 每个项目都有相同的包模式- my.com.package .
这个 processor 以及 rules 两个项目都包含用自定义注解注解的类 @Condition . 注解接口使用 @Retention(RetentionPolicy.RUNTIME) . 当我扫描带注解的类时 @Conditionservice 或者 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());
            }
        }

带注解的类 @Conditionprocessor 项目具有正确的类名( my.com.package.x.Class ),但是这些类用 @Conditionrules 项目的完全限定类名不正确( my.com.Class )它只会在项目中的5个类名中找到2个具有注解。
如果我把论点改成 scanner.findCandidateComponents 中的完整包路径 rules 项目( my.com.package.rules )在扫描时 processor 或者 service 扫描器找不到候选人。如果我使用 my.com.* 作为论据,它只在 processor 项目。
我在这里看到了一个类似的问题,使用classpathscanningcandidatecomponentprovider和多个jar文件?解决方案是将类装入器传递给组件提供程序。我试着让类的类加载器进行扫描并像这样将其传递给提供者

scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));

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

ve7v8dk2

ve7v8dk21#

愚蠢的错误,问题是我的版本不对 rules 在pom中为我的 processor 所以它使用的是旧版本的代码。然而这

Condition condition = c.getAnnotation(Condition.class);

对于从jar中获取的类返回null,因此如果不是从我的工作区中的源代码运行此代码,我会有点担心。

相关问题