OpenApi 3.0 SpringBoot控制器使用
OpenApi 3.0 SpringBoot Controller use
使用 openapi maven 插件:
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
</dependency>
并使用 pom 配置生成 spring 引导控制器,例如:
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
<executions>
<execution>
<id>spring-server</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<!-- specify the swagger yaml -->
<inputSpec>${project.resources[0].directory}/pet-store.yaml</inputSpec>
<!-- target to generate java client code -->
<generatorName>spring</generatorName>
<!-- pass any necessary config options -->
<configOptions>
<serializableModel>true</serializableModel>
<snapshotVersion>true</snapshotVersion>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
会生成这样的控制器:
@Controller
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
public class StoreApiController implements StoreApi {
private final NativeWebRequest request;
@org.springframework.beans.factory.annotation.Autowired
public StoreApiController(NativeWebRequest request) {
this.request = request;
}
@Override
public Optional<NativeWebRequest> getRequest() {
return Optional.ofNullable(request);
}
}
这很好,但是我如何绑定到它来添加业务逻辑而不更改实际生成的代码?如果我扩展控制器以添加业务逻辑,我会遇到各种问题。
您应该如何使用此生成的代码,扩展它以添加正确的业务逻辑而不更改生成的代码,这会很糟糕。?
我在尝试处理 OAS 3.0 时遇到了你的问题,因此使用了提到的 openapi-generator-maven-plugin
。同时,我让它准确地生成了您所描述的内容。
我建议通过
来处理这个问题
- 从您的代码和
生成您的模型和 API 类 到一个 单独的包
- 配置 Spring 的
@ComponentScan
注释不包含生成的 类(单独使用 basePackages
属性 或将其与显式组合excludeFilters
属性).
是的,修改生成的 类 是不好的。我只是将它们用作创建实际控制器的起点。
修改: 在以各种方式配置代码生成后,我发现最好的解决方案只有 API (接口)正在创建。这样我就可以在没有其他实现干扰的情况下实现我的控制器。
为了实现这个,我的插件配置现在看起来像这样(使用 configOptions/interfaceOnly
选项):
<plugin>
<!-- generate REST API from spec -->
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
<generatorName>spring</generatorName>
<generateModels>true</generateModels>
<generateApis>true</generateApis>
<generateApiDocumentation>true</generateApiDocumentation>
<generateSupportingFiles>true</generateSupportingFiles>
<modelPackage>example.openapi.model</modelPackage>
<apiPackage>example.openapi.api</apiPackage>
<package>example.openapi</package>
<output>${generated.sources.restapi.dir}</output>
<configOptions>
<interfaceOnly>true</interfaceOnly>
<dateLibrary>java8-localdatetime</dateLibrary>
<java8>true</java8>
<useBeanValidation>true</useBeanValidation>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
使用 openapi maven 插件:
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
</dependency>
并使用 pom 配置生成 spring 引导控制器,例如:
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
<executions>
<execution>
<id>spring-server</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<!-- specify the swagger yaml -->
<inputSpec>${project.resources[0].directory}/pet-store.yaml</inputSpec>
<!-- target to generate java client code -->
<generatorName>spring</generatorName>
<!-- pass any necessary config options -->
<configOptions>
<serializableModel>true</serializableModel>
<snapshotVersion>true</snapshotVersion>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
会生成这样的控制器:
@Controller
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
public class StoreApiController implements StoreApi {
private final NativeWebRequest request;
@org.springframework.beans.factory.annotation.Autowired
public StoreApiController(NativeWebRequest request) {
this.request = request;
}
@Override
public Optional<NativeWebRequest> getRequest() {
return Optional.ofNullable(request);
}
}
这很好,但是我如何绑定到它来添加业务逻辑而不更改实际生成的代码?如果我扩展控制器以添加业务逻辑,我会遇到各种问题。
您应该如何使用此生成的代码,扩展它以添加正确的业务逻辑而不更改生成的代码,这会很糟糕。?
我在尝试处理 OAS 3.0 时遇到了你的问题,因此使用了提到的 openapi-generator-maven-plugin
。同时,我让它准确地生成了您所描述的内容。
我建议通过
来处理这个问题- 从您的代码和 生成您的模型和 API 类 到一个 单独的包
- 配置 Spring 的
@ComponentScan
注释不包含生成的 类(单独使用basePackages
属性 或将其与显式组合excludeFilters
属性).
是的,修改生成的 类 是不好的。我只是将它们用作创建实际控制器的起点。
修改: 在以各种方式配置代码生成后,我发现最好的解决方案只有 API (接口)正在创建。这样我就可以在没有其他实现干扰的情况下实现我的控制器。
为了实现这个,我的插件配置现在看起来像这样(使用 configOptions/interfaceOnly
选项):
<plugin>
<!-- generate REST API from spec -->
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
<generatorName>spring</generatorName>
<generateModels>true</generateModels>
<generateApis>true</generateApis>
<generateApiDocumentation>true</generateApiDocumentation>
<generateSupportingFiles>true</generateSupportingFiles>
<modelPackage>example.openapi.model</modelPackage>
<apiPackage>example.openapi.api</apiPackage>
<package>example.openapi</package>
<output>${generated.sources.restapi.dir}</output>
<configOptions>
<interfaceOnly>true</interfaceOnly>
<dateLibrary>java8-localdatetime</dateLibrary>
<java8>true</java8>
<useBeanValidation>true</useBeanValidation>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>