【问题标题】:Swagger autogen - overwriting implementation codeSwagger autogen - 覆盖实现代码
【发布时间】:2018-02-24 19:51:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java spring swagger swagger-codegen


    【解决方案1】:

    我生成的 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"
    }
    

    在以下情况下调用构建任务:

    • java 代码编译(如在 ci-server 上)
    • IDE 类路径(在我的例子中为 Eclipse)已初始化

    compileJava.dependsOn swaggerGen

    希望对你有帮助

    【讨论】:

    • 您是否手动复制和粘贴所有实现?我的 API 规范很长……你实现过 swagger-codegen 生成的接口吗?
    • 我稍微重构了模板。 API 控制器只调用注入到控制器中的 api 接口。这样我只需要将 API 接口实现为 spring 组件。我使用 gradle 插件来生成招摇。 plguin 提供了配置生成器输出的选项。所以一切都会自动发生
    • 这听起来像是我需要做的。您是如何设置此工作流程的?
    猜你喜欢
    • 2022-12-26
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多