2016-05-09 2 views
0

У меня есть проект java, содержащий приложение загрузки весны под названием processor. Этот проект зависит от проекта под названием rules и проекта под названием service. Каждый проект имеет один и тот же шаблон упаковки - my.com.package.
Проекты processor и rules оба содержат классы, аннотированные пользовательской аннотацией @Condition. Интерфейс аннотации аннотируется @Retention(RetentionPolicy.RUNTIME). При сканировании для классов, аннотированных @Condition из service или processor нравится этаClassPathScanningCandidateComponentProvider.findCandidateComponents имеют неправильное имя класса

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()); 
      } 
     } 

Классы снабженными @Condition в проекте processor имеют правильное название класса (my.com.package.x.Class), но классы аннотированные с @Condition в проекте rules есть неправильное полное имя класса (my.com.Class), и он находит только 2 из 5 имен классов в проекте, которые имеют аннотацию.
Если я изменил аргумент на scanner.findCandidateComponents на полный путь пакета в проекте rules (my.com.package.rules) при сканировании либо в processor, либо в service сканер не находит кандидатов. Если я использую my.com.* в качестве аргумента, он находит только кандидатов в проекте processor.
Я видел аналогичный вопрос здесь Using ClassPathScanningCandidateComponentProvider with multiple jar files?, и решение заключалось в том, чтобы передать загрузчик класса поставщику компонента. Я пытался получать загрузчик классов класса делает сканирование и передать его поставщику, как этот

scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader)); 

и это не изменило результатов для меня.

ответ

0

Глупая ошибка, проблема была у меня была неправильная версия проекта rules, определенного в pom для моего проекта processor, поэтому он использовал более старую версию кода. Однако это

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

возвращается нуль для классов, взятых из кувшина, так что это касается меня немного, если этот код не был запущен из источника в моем рабочем пространстве.

Смежные вопросы