基于现有类并带有注释的gradle任务生成源代码

时间:2019-05-11 15:37:31

标签: java gradle reflection annotations javapoet

我正在创建springboot应用程序,大多数时候我发现自己在为模型编写样板代码-存储库,服务,控制器,构建器...我不想这样做。 < / p>

根据我的经验,以前的工作和研究,我想到了一个概念。基本上如下:

  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脚本提供一些帮助。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

Its documentation非常详细地介绍了如何使用,配置和扩展它(创建自定义样板)。它可能与您要找的不完全相同。但是您可以向我发送建议,问题,进行分叉和修改,或者只是从中获取想法。希望这可以帮助。