【发布时间】:2018-02-24 19:51:46
【问题描述】:
这里有人有应对不断变化的 API 规范的好策略吗?
API 更改 -> 重新生成代码 -> 实施更改。
我正在考虑生成 Java 接口并拥有实现这些接口的单独类文件。任何接口不匹配都会显示在 IDE 中(例如 IntelliJ)
现在,如果我执行实现,我编写实现的文件会被覆盖...
【问题讨论】:
标签: java spring swagger swagger-codegen
这里有人有应对不断变化的 API 规范的好策略吗?
API 更改 -> 重新生成代码 -> 实施更改。
我正在考虑生成 Java 接口并拥有实现这些接口的单独类文件。任何接口不匹配都会显示在 IDE 中(例如 IntelliJ)
现在,如果我执行实现,我编写实现的文件会被覆盖...
【问题讨论】:
标签: java spring swagger swagger-codegen
我生成的 swagger 代码将放在 src/gen/Java 下。每次我生成整个文件夹都会被删除。这样接口的实现就不会被覆盖。我也没有提交 gen 文件夹。
编辑
为了更详细地说明这一点,请查看模板:https://github.com/Mehtrick/swagger-templates
重要的是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);
}
}
然后生成的UsersApi是这样的:
public interface UsersApi {
/**
* Loads the current user
*/
ResponseEntity<User> getCurrentUser() throws Exception;
/**
* Registers a new user
*/
ResponseEntity<Void> registerUser(@Valid @RequestBody User body) throws Exception;
}
我所要做的就是将生成的api接口实现为spring组件。
这些类是使用这个 gradle 插件从 Swagger 生成的:
https://github.com/int128/gradle-swagger-generator-plugin
构建配置如下所示:
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")
}
在这个例子中,使用了普通的 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"
}
在以下情况下调用构建任务:
compileJava.dependsOn swaggerGen
希望对你有帮助
【讨论】: