spring-boot - 我已经用 openapi-generator-maven-plugin 生成了我的 API 服务器,现在怎么办?
问题描述
我一定是遗漏了一些明显的东西,这将是我的墓志铭。我创建了一个 swagger 2.0 文档来表示一个简单的 API。它有一个返回整数的 POST 操作。我使用 openapi-generator-maven-plugin 插件在我的 Spring Boot 项目中生成控制器、模型等。
如何创建控制器来处理请求?
往里看,/work-queue-api/target/generated-sources/openapi/src/main/java
我看到了 3 件事。ApiUtil.java
, WorkItemApi.java
(接口), WorkItemApiController.java
(实现)
我在实现 WorkItemApiController 的应用程序中创建了一个新控制器。但是当我这样做时,Spring 抱怨它的方法已经被映射。
API“有效”,因为我可以启动它并使用 Swagger UI 发布。但显然该请求并未实际处理,而是返回了默认响应。生成的界面贴在下面。它有一种实现的方法。我希望能够以该方法调用服务。或者覆盖它的方法。
这是为 WorkItemApi 生成的接口
/**
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (4.0.2).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
package com.etisoftware.work_queue.webapi.controller.v1;
import com.etisoftware.work_queue.webapi.model.v1.Error;
import com.etisoftware.work_queue.webapi.model.v1.NewWorkItem;
import com.etisoftware.work_queue.webapi.model.v1.WorkItemResponse;
import io.swagger.annotations.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Validated
@Api(value = "WorkItem", description = "the WorkItem API")
public interface WorkItemApi {
default Optional<NativeWebRequest> getRequest() {
return Optional.empty();
}
@ApiOperation(value = "Adds a new workItem", nickname = "v1WorkItemsPost", notes = "", response = WorkItemResponse.class, tags={ "workItem", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = WorkItemResponse.class),
@ApiResponse(code = 201, message = "Successful operation", response = WorkItemResponse.class),
@ApiResponse(code = 400, message = "Bad Request", response = Error.class),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden", response = Error.class),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Internal server error", response = Error.class) })
@RequestMapping(value = "/v1/work-items",
produces = { "application/problem+json", "application/json" },
consumes = { "application/json" },
method = RequestMethod.POST)
default ResponseEntity<WorkItemResponse> v1WorkItemsPost(@ApiParam(value = "Parameters to represent a new work item." ,required=true ) @Valid @RequestBody NewWorkItem newWorkItem) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
ApiUtil.setExampleResponse(request, "application/json", "{ \"controllerWorkNumber\" : 0.8008281904610115}");
break;
}
}
});
return new ResponseEntity<>(HttpStatus.valueOf(200));
}
}
pom.xml 中的插件配置
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.0.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/swagger.yaml</inputSpec>
<generatorName>spring</generatorName>
<addCompileSourceRoot>true</addCompileSourceRoot>
<configOptions>
<basePackage>com.etisoftware.work_queue</basePackage>
<configPackage>
com.etisoftware.work_queue.webapi.configuration
</configPackage>
<apiPackage>
com.etisoftware.work_queue.webapi.controller.v1
</apiPackage>
<modelPackage>
com.etisoftware.work_queue.webapi.model.v1
</modelPackage>
<invokerPackage>
com.etisoftware.work_queue
</invokerPackage>
<swaggerDocketConfig>true</swaggerDocketConfig>
<useOptional>true</useOptional>
<returnSuccessCode>true</returnSuccessCode>
<useTags>true</useTags>
<virtualService>false</virtualService>
<dateLibrary>java8</dateLibrary>
<hideGenerationTimestamp>true</hideGenerationTimestamp>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
解决方案
解决方案是我使用的是旧版本的插件。版本 4.2.3 包括用于排除控制器生成的配置选项,这正是我所需要的。
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.2.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/swagger.yaml</inputSpec>
<generatorName>spring</generatorName>
<addCompileSourceRoot>true</addCompileSourceRoot>
<configOptions>
<basePackage>com.etisoftware.work_queue</basePackage>
<configPackage>
com.etisoftware.work_queue.webapi.configuration
</configPackage>
<apiPackage>
com.etisoftware.work_queue.webapi.controller.v1
</apiPackage>
<modelPackage>
com.etisoftware.work_queue.webapi.model.v1
</modelPackage>
<invokerPackage>
com.etisoftware.work_queue
</invokerPackage>
<swaggerDocketConfig>true</swaggerDocketConfig>
<useOptional>true</useOptional>
<returnSuccessCode>true</returnSuccessCode>
<useTags>true</useTags>
<virtualService>false</virtualService>
<dateLibrary>java8</dateLibrary>
<hideGenerationTimestamp>true</hideGenerationTimestamp>
<interfaceOnly>true</interfaceOnly>
<skipDefaultInterface>true</skipDefaultInterface>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
我要提供的一个快速入门提示是,在第一代中,允许插件生成控制器。然后,您可以从界面中刮出所有注释并将内容放入您自己的控制器中。然后清理项目,并在没有控制器的情况下重新生成源。
推荐阅读
- bash - 在 osx 上使用 xld 在命令行中拆分 cued 音频文件
- python-3.x - Numpy 数组列表未成功附加所有整数
- ssl - 如何使用从1&1 IONOS上传的private_key.key / ssl_certificate.cer / ssl_certificate_INTERMEDIATE.cer 并配置tomcat服务器
- getsockopt - 如何 printf() 声明和初始化 getsockname() 函数?
- controller - 如何使用 react-hook-forms 切换单选按钮选择?
- python - AttributeError:类型对象“数据库”没有属性“scoreDB”
- python - 如何用空字典初始化类 - Python
- ubuntu - 我无法确认任何 api 正在通过 microk8s 中的 localhost 工作
- snowflake-cloud-data-platform - Snowflake - 删除 Schema 中的所有外键,可能使用 CTE 删除
- django - 如何在 VSCode 终端中激活 python 虚拟环境