Использование OpenApi 3.0 SpringBoot Controller - PullRequest
1 голос
/ 26 января 2020

Использование плагина openapi maven:

<dependency>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.2.2</version>
</dependency>

и генерация контроллеров пружинной загрузки с использованием pom config, например:

     <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);
    }

}

Это замечательно, но как мне связать это, чтобы добавить бизнес-логи c без изменения фактического сгенерированного кода? Если я расширяю контроллер для добавления бизнес-логики c, я получаю все виды проблем.

Как вы должны использовать этот сгенерированный код, чтобы расширить его, чтобы добавить правильные бизнес-логики c без изменения сгенерированный код, который будет плохим .?

1 Ответ

2 голосов
/ 29 января 2020

Я сталкивался с вашим вопросом, когда пытался справиться с OAS 3.0 и поэтому использовал упомянутый openapi-generator-maven-plugin. Тем временем я получил его, чтобы генерировать именно то, что вы описываете.

Я бы предложил решить эту проблему путем

  1. генерации вашей модели и классов API в отдельном пакете из вашего кода и
  2. настройке 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...