Java 大摇大摆自动生成-覆盖实现代码
这里有没有人有很好的策略来应对不断变化的API规范 API更改->重新生成代码->实现更改 我正在考虑生成Java接口,并使用单独的类文件来实现这些接口。任何接口不匹配都将显示在IDE中(例如IntelliJ)Java 大摇大摆自动生成-覆盖实现代码,java,spring,swagger,swagger-codegen,Java,Spring,Swagger,Swagger Codegen,这里有没有人有很好的策略来应对不断变化的API规范 API更改->重新生成代码->实现更改 我正在考虑生成Java接口,并使用单独的类文件来实现这些接口。任何接口不匹配都将显示在IDE中(例如IntelliJ) 现在如果我执行实现,我编写实现的文件将被覆盖…我生成的招摇过市代码将放在src/gen/Java下。每次生成时,整个文件夹都将被删除。这样,接口的实现就不会被覆盖。此外,我不提交gen文件夹 编辑 为了进一步说明,请看一下模板: 重要的是api和apicontroller.mustach
现在如果我执行实现,我编写实现的文件将被覆盖…我生成的招摇过市代码将放在src/gen/Java下。每次生成时,整个文件夹都将被删除。这样,接口的实现就不会被覆盖。此外,我不提交gen文件夹 编辑 为了进一步说明,请看一下模板: 重要的是api和apicontroller.mustache 生成的控制器类如下所示
@RestController
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Throwable.class)
public class UsersApiController {
@Autowired
private UsersApi UsersApiService;
@PreAuthorize("isAuthenticated() and hasAuthority('USER')")
@RequestMapping(value = "/users/current", produces = { "application/json" }, method = RequestMethod.GET)
public ResponseEntity<User> getCurrentUser() throws Exception {
return UsersApiService.getCurrentUser();
}
@RequestMapping(value = "/users", produces = { "application/json" }, method = RequestMethod.POST)
public ResponseEntity<Void> registerUser(
@Valid @RequestBody User body
) throws Exception {
return UsersApiService.registerUser(body);
}
}
在本例中,使用了普通的spring-swagger-codegen,但与我在${projectDir}/swagger/templates
buildscript被配置为将生成的文件移动到src/gen/java
,然后删除整个src/gen/java
文件夹
task cleanSwagger(type: Delete){
delete "${projectDir}/src/gen/java/"
}
task moveSwagger(type: Copy){
dependsOn "generateSwaggerCode"
from "${buildDir}/swagger-code/src/main/java"
into "${projectDir}/src/gen/java"
}
在以下情况下调用生成任务:
- java代码可以编译(就像在ci服务器上一样)
- IDE类路径(在我的例子中是Eclipse)已初始化
compileJava.dependsOn-swaggerGen
希望这有帮助您是否手动复制并粘贴所有实现?我的API规范很长。。。您是否实现过由swagger codegen生成的接口?我对模板进行了一些重构。API控制器仅调用注入控制器中的API接口。这样,我只需要将API接口实现为spring组件。我使用gradle插件生成swagger。plguin提供配置发电机输出的选项。所以一切都是自动发生的这听起来像是我需要做的。您是如何设置此工作流的?
ext {
swaggeryaml = file("${projectDir}/swagger/swagger.yaml")
}
apply plugin: "org.hidetake.swagger.generator"
validateSwagger {
inputFile = swaggeryaml
}
generateSwaggerCode {
language = 'spring'
inputFile = swaggeryaml
components = ['models','apis']
configFile = file("${swaggerconfigpath}")
templateDir = file("${projectDir}/swagger/templates")
}
task cleanSwagger(type: Delete){
delete "${projectDir}/src/gen/java/"
}
task moveSwagger(type: Copy){
dependsOn "generateSwaggerCode"
from "${buildDir}/swagger-code/src/main/java"
into "${projectDir}/src/gen/java"
}