【发布时间】:2016-05-09 22:44:34
【问题描述】:
我有一个 java 项目,其中包含一个名为 processor 的 Spring Boot 应用程序。该项目依赖于一个名为rules 的项目和一个名为service 的项目。每个项目都有相同的包模式 - my.com.package.processor 和 rules 项目都包含使用自定义注释 @Condition 注释的类。注解接口使用@Retention(RetentionPolicy.RUNTIME)注解。当我像这样从service 或processor 扫描带有@Condition 注释的类时
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 注释的类具有不正确的完全限定类名(@ 987654339@),它只在项目中的 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));
它并没有改变我的任何结果。
【问题讨论】:
标签: java spring spring-boot annotations