2016-05-09 3 views
0

processorというスプリングブートアプリケーションを含むJavaプロジェクトがあります。このプロジェクトは、rulesというプロジェクトとserviceというプロジェクトに依存しています。すべてのプロジェクトは同じパッケージパターン(my.com.package)を持っています。
processorおよびrulesプロジェクトには、カスタム注釈@Conditionで注釈が付けられたクラスが含まれています。アノテーションインタフェースには@Retention(RetentionPolicy.RUNTIME)と注釈が付けられています。私はserviceから@Conditionまたは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()); 
      } 
     } 

で注釈を付けたクラスをスキャンすると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

間違えて私のprocessorプロジェクトのpomに定義されたrulesプロジェクトのバージョンが間違っていたので、古いバージョンのコードを使用していました。 しかし、この

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

が瓶から取り出したクラスに対してnullを返しので、このコードは私のワークスペース内のソースから実行されていない場合、これは私に少し関係します。

関連する問題