Я создаю приложения Springboot, и большую часть времени я пишу шаблонный код для своих моделей - репозиториев, служб, контроллеров, построителей ... Я не хочу этого делать.
Основываясь на моем опыте, предыдущих работах и исследованиях, у меня в голове возникла какая-то концепция. В основном следующие:
- Я создаю аннотацию
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface CodeGenSubject {
}
- Я создаю процессор
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)
}
}
}
- Я пишу свой предметный класс
@CodeGenSubject
@Entity
public class MyDomainSpecificEntity {
@Id
private Long id;
private String stuff;
// getters and setters
}
- И, наконец, я создаю задачу 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.
Наконец ... лучшим был бы очищенный пример проекта. Если бы кто-нибудь когда-либо играл с этим предметом и имел бы какое-то публичное репо, это было бы очень кстати.
Спасибо.