java - OpenApi 3 codegen java如何实现
问题描述
有一个 openapi yml 文件,其中包含一个简单的 get 请求和响应,从这个 yml 生成下面的 java 文件(以及其他文件)。
这些java文件应该如何使用?如何挂钩生成的文件?
可以简单地将生成的主类和控制器类复制到主源树中,但似乎不是正确的方法。
- - 编辑 - -
在生成的Controller类中,如何覆盖ExampleApi接口中存在的默认响应?无需修改生成的 Controller 类并将其放在 VCS 中。
- - 编辑 - -
构建.gradle.kts
...
openApiGenerate {
generatorName.set("spring")
inputSpec.set("$rootDir/specs/api-example.yml")
outputDir.set("$buildDir/generated")
apiPackage.set("com.example.openapi.generated.api")
invokerPackage.set("com.example.openapi.generated.invoker")
modelPackage.set("com.example.openapi.generated.model")
configOptions.set(mapOf(
"dateLibrary" to "java8"
))
systemProperties.set(mapOf(
"modelDocs" to "false"
))
}
...
这些类应该怎么做?
package com.example.openapi.generated.invoker;
import com.fasterxml.jackson.databind.Module;
import org.openapitools.jackson.nullable.JsonNullableModule;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.openapi.generated.invoker", "com.example.openapi.generated.api" , "org.openapitools.configuration"})
public class OpenAPI2SpringBoot implements CommandLineRunner {
@Override
public void run(String... arg0) throws Exception {
if (arg0.length > 0 && arg0[0].equals("exitcode")) {
throw new ExitException();
}
}
public static void main(String[] args) throws Exception {
new SpringApplication(OpenAPI2SpringBoot.class).run(args);
}
static class ExitException extends RuntimeException implements ExitCodeGenerator {
private static final long serialVersionUID = 1L;
@Override
public int getExitCode() {
return 10;
}
}
@Bean
public WebMvcConfigurer webConfigurer() {
return new WebMvcConfigurer() {
/*@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("Content-Type");
}*/
};
}
@Bean
public Module jsonNullableModule() {
return new JsonNullableModule();
}
}
package com.example.openapi.generated.api;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.NativeWebRequest;
import java.util.Optional;
@Controller
@RequestMapping("${openapi.basic.base-path:}")
public class ExampleApiController implements ExampleApi {
private final NativeWebRequest request;
@org.springframework.beans.factory.annotation.Autowired
public ExampleApiController(NativeWebRequest request) {
this.request = request;
}
@Override
public Optional<NativeWebRequest> getRequest() {
return Optional.ofNullable(request);
}
}
解决方案
您需要告诉 gradle 编译文件,无需复制它们。
将带有生成文件的路径添加到sourceSets
您的项目中。像这样的东西:
sourceSets {
main {
java {
srcDir("$buildDir/generated")
}
}
}
推荐阅读
- python - requests.get 没有获取所有标签。我需要那个页面的表格
- java - 随机数组
- javascript - 如何将拖放存储到本地存储
- python - TypeError:必须是 str,而不是 mail.mass_mailing.list
- c# - Sharepoint在线CSOM生成列表项显示url
- c++ - 为什么 C++ 编译器不能知道指针指向派生类?
- python - spaCy - 自定义模型上的文本处理
- php - PHP从项目列表创建数组
- javascript - Laravel:如何在创建后停留在页面上再创建一个项目
- amazon-web-services - 在 AWS 中创建具有多个值的标签