Одна из проблем, с которой я столкнулся при использовании DTO, заключается в том, что я часто отгружаю (случайно) объекты вместе с DTO. Чтобы решить эту проблему, я создал еще один проект Maven с аннотацией (@ValidDTO) и его процессор, который определяет, имеет ли DTO, аннотированный @ValidDTO, аннотированные поля @Entity.
Это моя аннотация.
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface ValidDTO {}
И это мой процессор.
@SupportedAnnotationTypes("com.aj.annotations.ValidDTO")
@SupportedSourceVersion(SourceVersion.RELEASE_11)
public class ValidDTOProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set,
RoundEnvironment roundEnv) {
List<Entity> entityFields = roundEnv.getElementsAnnotatedWith(ValidDTO.class)
.stream()
.filter(element -> element.getKind()==ElementKind.CLASS || element.getKind()==ElementKind.INTERFACE)
.map(Element::getEnclosedElements)
.flatMap(List::stream)
.filter(element -> element.getKind()==ElementKind.FIELD)
.map(element -> element.getAnnotation(Entity.class))
.collect(Collectors.toList());
if (!entityFields.isEmpty()) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Types annotated with ValidDTO " +
"cannot have member variables that are @Entity annotated");
}
return true;
}
}
Вот как мой POM. xml ищет проект Maven с аннотацией и его процессором
<groupId>com.aj</groupId>
<artifactId>aj-annotations</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<generatedSourcesDirectory>${project.build.directory}/generated-sources/
</generatedSourcesDirectory>
<proc>none</proc>
<annotationProcessors>
<annotationProcessor>
com.aj.annotations.processors.ValidDTOProcessor
</annotationProcessor>
</annotationProcessors>
<debug>true</debug>
</configuration>
</plugin>
</plugins>
</build>
Итак, я установил этот пакет как зависимость в другом проектируемом и пометил им DTO. Я специально добавил пару сущностей в качестве переменных-членов, чтобы увидеть ошибку.
@ValidDTO
public class FacilityDTO {
private User user;
private List<User> users;
}
, где
@Entity
@Table("User")
public class User {}
- это сущность.
Теперь моя пользовательская аннотация работает отлично работает, когда я запускаю mvn clean install
или собираю проект. Я вижу ожидаемое "Types annotated with ValidDTO cannot have member variables that are @Entity annotated"
в терминале.
Однако я не вижу ошибки в редакторе IDE. Я пробовал и Intellij, и Eclipse, и я не вижу никакой красной волнистой линии под аннотацией, говорящей мне, что DTO недействителен.
Ближайшим ожидаемым желаемым поведением, на которое я могу ссылаться, является ошибка компиляции при использовании @FunctionalInterface
на интерфейсе, который имеет более одного абстрактного метода.
Мне просто нужна помощь в настройке моей IDE. Любая помощь приветствуется!