繁体   English   中英

Swagger autogen - 覆盖实现代码

[英]Swagger autogen - overwriting implementation code

这里有人有处理不断变化的 API 规范的好策略吗?

API 更改 -> 重新生成代码 -> 实施更改。

我正在考虑生成 Java 接口并拥有实现这些接口的单独类文件。 任何接口不匹配都会出现在 IDE 中(例如 IntelliJ)

现在,如果我执行实现,我编写实现的文件将被覆盖......

我生成的 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- ${projectDir}/swagger/templates但我在${projectDir}/swagger/templates下使用了我的自定义${projectDir}/swagger/templates

构建脚本被配置为将生成的文件移动到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-server上一样)
  • IDE 类路径(在我的例子中是 Eclipse)被初始化

compileJava.dependsOn swaggerGen

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM