4

我正在创建 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

现在我正在开发一个带有 springboot 应用程序的示例多模块 gradle 项目。我有一个实体(MyDomainSpecificEntity),我试图让 gradle 根据我的注释和处理器为我生成一些源代码。

首先,如果我在概念上是错误的,最大的帮助将是一些建议。

其次,如果我不是,我将不胜感激该 gradle 脚本的一些帮助。

最后......最好是一个干净的示例项目,如果有人曾经玩过这个主题,并且有某种公共回购,那将是最受欢迎的。

谢谢。

4

1 回答 1

0

我实际上已经玩过这个概念,并且在 github 上有一个开源的 gradle 插件(gradle-boilerplate-generator-plugin),它可以生成样板。

它是一个通用插件,可以生成任何类型的样板(用户可以使用简单的YAML描述、基于FreeMarker的模板和 gradle 闭包配置而不是带有您喜欢的注释的 java 类来定义自己的样板)。这个插件默认带有一些演示样板。

而且,实际上,这些演示样板之一包括(开箱即用)一个名为boilerplateWebServiceResource生成典型 Web 服务资源所需的典型 Entity、DTO、Repo、Controller、Resource 等类的任务。

它的文档非常详细地介绍了如何使用、配置和扩展它(创建自定义样板)。它可能不是您正在寻找的;但是您可以向我发送建议、问题、fork 和修改它,或者只是从中获取想法。希望这可以帮助。

于 2019-05-11T15:59:00.547 回答