Проверка кода Intellij для пользовательской аннотации - PullRequest
1 голос
/ 23 марта 2020

Одна из проблем, с которой я столкнулся при использовании 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. Любая помощь приветствуется!

1 Ответ

1 голос
/ 23 апреля 2020

В IntelliJ вы можете создавать собственные проверки. Их можно использовать для предупреждения о наличии пользовательских шаблонов поиска в вашем коде (https://www.jetbrains.com/help/idea/creating-custom-inspections.html).

Для вашего случая: Go в настройки -> Редактор -> Проверки , Активируйте «Проверка поиска по структуре» и добавьте «Шаблон поиска»:

enter image description here

Добавьте следующий структурный поиск:

enter image description here

Вы можете изменить «Серьезность» на «Ошибка», чтобы получить красные волнистые линии. :)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...