【问题标题】:Generating source code with a gradle task based on existing classes with annotations on them基于现有类和注释生成带有 gradle 任务的源代码
【发布时间】:2019-09-29 04:50:34
【问题描述】:

我正在创建 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 脚本的一些帮助。

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

谢谢。

【问题讨论】:

    标签: java gradle reflection annotations javapoet


    【解决方案1】:

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

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

    实际上,其中一个演示样板包括(开箱即用)一个名为 boilerplateWebServiceResource 的任务,用于生成典型 Web 所需的典型实体、DTO、Repo、控制器、资源等类服务资源。

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

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      相关资源
      最近更新 更多