Генерация исходного кода с помощью задачи gradle на основе существующих классов с аннотациями к ним

Я создаю приложения 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 в корневом проекте с несколькими тысячами строк. Спасибо

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

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

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

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

Спасибо.


person Bálint Tóth    schedule 11.05.2019    source источник


Ответы (1)


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

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

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

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

person Marco R.    schedule 11.05.2019