Я создал аннотацию @EnableEntityProcessing
, предназначенную для использования в тестах (src/test/java). Также я создал связанный процессор аннотаций EnableEntityProcessingProcessor
.
Целью этого EnableEntityProcessingProcessor
является сканирование аннотаций @Entity
(javax.persistence.Entity), найденных в src/main/java, и создание кода на основе этих аннотаций. Я бы хотел, чтобы код генерировался в тестовом ресурсе, потому что он предназначен для использования только в тестах.
Основная проблема заключается в том, что объект 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 их не находит, потому что он связан с тестовыми исходниками.
RoundEnvironment
и почему он указывает на класс, который является тестовым кодом? - person tonakai   schedule 12.10.2016@TestAnnotation
в своем основном коде, он должен быть создан там, а не в тестовой папке. даже если вы аннотируете тестовые классы/методы или используете другую аннотацию в сгенерированном коде, поскольку вы его генерируете. - person tonakai   schedule 12.10.2016EnableEntityProcessing
) предназначена для включения обработки элементов с аннотациейjavax.persistence.Entity
из производственного кода. Я не хочу иметь его в основной/производственной версии, потому что он предназначен только для тестов. Я обновил свой пост. - person Alex   schedule 13.10.2016