Генерация исходного кода с задачей Gradle на основе существующих классов с аннотациями на них - PullRequest
1 голос
/ 11 мая 2019

Я создаю приложения Springboot, и большую часть времени я пишу шаблонный код для моих моделей - репозиториев, сервисов, контроллеров, сборщиков ... Я не хочу этого делать.

Основываясь на моем опыте, предыдущих работах и ​​исследованиях, у меня в голове возникла концепция. В основном следующее:

  1. Я создаю аннотацию
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface CodeGenSubject {
}
  1. Я создаю процессор
public class MyProcessor extends AbstractProcessor {
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return Collections.singleton(CodeGenSubject.class.getCanonicalName());
    }

    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        for(Element e: roundEnvironment.getElementsAnnotatedWith(CodeGenSubject.class)){
            // Observe fields and methods with reflection API
            // "Write" some code with JavaPoet
            // Place the generated code to the src/java folder
            // (with javax.annotation.processing.Filer)
        }
    }
}
  1. Я пишу свой предметный класс
@CodeGenSubject
@Entity
public class MyDomainSpecificEntity {
    @Id
    private Long id;
    private String stuff;

    // getters and setters
}
  1. И наконец, я создаю задание gradle (?)
task myCodeGeneratorTask(type: ???, group: "", desription: "") {
    // With this I am stuck
}

В идеале этот генератор шаблонов должен быть отдельным модулем.

Я видел несколько примеров проектов (в основном для Android), а затем я нашел наиболее многообещающие:

https://www.baeldung.com/java-annotation-processing-builder

Было бы идеально, но ... он использует maven, и код помещается в абсолютно недоступный репозиторий с файлом pom.xml в корневом проекте с несколькими тысячами строк. Спасибо: D

Сейчас я работаю над примером многомодульного проекта Gradle с приложением Springboot. У меня есть одна сущность (MyDomainSpecificEntity), и я пытаюсь заставить gradle генерировать для меня исходный код на основе моих аннотаций и процессора.

Во-первых, самой большой помощью были бы некоторые советы, если я концептуально ошибаюсь.

Во-вторых, если бы я не был, я был бы признателен за помощь в этом сценарии gradle.

И наконец ... лучшим будет проект с чистыми примерами. Если кто-нибудь когда-либо играл с этим предметом и имел какое-то публичное репо, это было бы очень кстати.

Спасибо.

1 Ответ

0 голосов
/ 11 мая 2019

Я на самом деле поиграл с этой концепцией и у меня есть плагин gradle с открытым исходным кодом на github ( gradle-кипарилат-генератор-плагин ), который генерирует эталоны.

Это универсальный плагин для генерации шаблонов любого типа (пользователь может определить свои собственные, используя простое описание YAML , FreeMarker и конфигурации закрытия gradle, а не классы java с аннотациями, которые вы предпочитаете). Этот плагин поставляется по умолчанию с несколькими демонстрационными шаблонами.

И, фактически, одна из этих демонстрационных шаблонов включает в себя (из коробки) задачу с именем boilerplateWebServiceResource для генерации типичных классов Entity, DTO, Repo, Controller, Resource и т. Д., Необходимых для типичной сети. ресурс службы.

В документации очень подробно описано, как его использовать, настроить и расширить (создать пользовательские шаблоны ). Это может быть не совсем то, что вы ищете; но вы можете присылать мне предложения, вопросы, разветвлять и модифицировать его, или просто получить идеи из него. Надеюсь это поможет.

...