2016-10-12 19 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作为由处理器生成的源代码的目录。