Я создаю приложения 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 в корневом проекте с несколькими тысячами строк. Спасибо: D
Сейчас я работаю над примером многомодульного проекта Gradle с приложением Springboot. У меня есть одна сущность (MyDomainSpecificEntity), и я пытаюсь заставить gradle генерировать для меня исходный код на основе моих аннотаций и процессора.
Во-первых, самой большой помощью были бы некоторые советы, если я концептуально ошибаюсь.
Во-вторых, если бы я не был, я был бы признателен за помощь в этом сценарии gradle.
И наконец ... лучшим будет проект с чистыми примерами. Если кто-нибудь когда-либо играл с этим предметом и имел какое-то публичное репо, это было бы очень кстати.
Спасибо.