Я сгенерировал свой сервер API с помощью openapi-generator-maven-plugin. Что теперь? - PullRequest
0 голосов
/ 25 февраля 2020

Я, должно быть, упускаю что-то очевидное, будет моей эпитафией. Я создал swagger 2.0 do c для представления простого API. У него есть одна операция POST, которая возвращает целое число. Я использовал плагин openapi-generator-maven-plugin для генерации контроллеров, моделей и т. Д. c в моем проекте Spring Boot.

Как создать контроллер для обработки запроса?

Просмотр /work-queue-api/target/generated-sources/openapi/src/main/java Я вижу 3 вещи. ApiUtil.java, WorkItemApi.java (интерфейс), WorkItemApiController.java (реализация)

Я создал новый контроллер в своем приложении, который реализует WorkItemApiController. Но когда я делаю это, Spring жалуется, что его методы уже сопоставлены.

API "работает" в том смысле, что я могу запустить его и использовать интерфейс Swagger для POST. Но очевидно, что запрос фактически не обрабатывается и возвращается ответ по умолчанию. Сгенерированный интерфейс вставлен ниже. У него есть один реализованный метод. Я хочу иметь возможность вызвать службу в этом методе. Или метод, который переопределяет это.

Вот сгенерированный интерфейс для 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>

1 Ответ

0 голосов
/ 26 февраля 2020

Решение в том, что я использовал более старую версию плагина. Версия 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>

Один совет по быстрому запуску, который я хотел бы предложить, заключается в том, что в первом поколении плагин должен генерировать контроллер. Затем вы можете вычеркнуть все аннотации из интерфейса и добавить их в свой собственный контроллер. Затем очистите проект и восстановите источники без контроллеров.

...