2016-10-12 52 views
0

我創建了旨在用於測試(src/test/java)的註釋@EnableEntityProcessing。 另外我還創建了關聯的註釋處理器EnableEntityProcessingProcessorRoundEnvironment指向測試源時如何掃描主要探測器中的註釋

EnableEntityProcessingProcessor的用途是掃描在src/main/java中找到的@Entity(javax.persistence.Entity)註釋,並基於這些註釋生成代碼。我想要在測試資源下生成代碼,因爲它只用於測試。

主要問題是RoundEnvironment對象指向測試代碼,因爲支持的註釋是@EnableEntityProcessing(僅在測試中使用)。

public final class MyProcessor extends EnableEntityProcessingProcessor { 
    private static final Class<EnableEntityProcessing> TEST_ANNOTATION_CLASS = 
      EnableEntityProcessing.class; 
    private static final Class<Entity> PROD_ANNOTATION_CLASS = Entity.class; 

    @Override 
    public final Set<String> getSupportedAnnotationTypes() { 
     return ImmutableSet.of(TEST_ANNOTATION_CLASS.getCanonicalName()); 
    } 

    @Override 
    public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
     final Set<? extends Element> elementsAnnotated = roundEnv.getElementsAnnotatedWith(TEST_ANNOTATION_CLASS); 
     if (!elementsAnnotated.isEmpty()) { 
      for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(PROD_ANNOTATION_CLASS)){ 
       // code generation based on properties from classes annotated with PROD_ANNOTATION_CLASS 
      } 
     } 
    } 
} 

從代碼示例,你可以看到,我掃描與EnableEntityProcessing註釋元素,並且如果存在的話,那麼我想尋找與Entity註釋類。問題是roundEnv沒有找到它們,因爲它鏈接到了測試源。

有誰知道如何解決這個問題?

+0

你能擴展你的問題嗎?也許還有一些代碼,這個'RoundEnvironment'是什麼,它爲什麼指向一個類是測試代碼? – tonakai

+0

我已經添加了一個代碼示例 – Alex

+0

我明白了,以及我認爲,因爲您在主代碼中引用了'@ TestAnnotation',它應該在那裏創建,而不是在測試文件夾中。即使您註釋測試類/方法,或者在您生成的代碼中使用其他註釋,因爲您正在生成它。 – tonakai

回答

0

您可以實現您的處理器,使其得到由@Entity觸發,將它應用到你的編譯單元的主代碼,但然後使用類似target/generated-test-sources作爲由處理器生成的源代碼的目錄。