Как правильно использовать openapi-generator для создания заглушек сервера ktor - PullRequest
3 голосов
/ 26 мая 2020

При попытке сгенерировать заглушки на стороне сервера для ktor из openapi, вывод для меня не очень удобен.

Я создал пример проекта на Github , где настройку можно просмотреть. Поскольку мне нужно использовать maven в моем реальном проекте, я использовал его и здесь, но думаю, это не должно иметь значения для других методов генерации.

Соответствующая часть POM такова:

<build>
    ...

    <plugins>
        ...

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>resources</id>
                    <phase>compile</phase>
                    <goals><goal>copy-resources</goal></goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/resources</directory>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Будет сгенерировано следующее:

  • Модель данных
  • Объект Paths.kt, содержащий пути к моим маршрутам в формате ktor-location
  • Пример заглушки, реализующей API как функцию расширения io.ktor.routing.Route
  • Полное приложение, включая конфигурации, Dockerfile, Gradle Files и т. Д. c.

Исходя из SpringBoot и Swagger, я немного сбит с толку, поскольку этот набор файлов не очень полезен, если вы хотите создать реальное приложение, реализующее реальный бизнес-лог c. Я ожидал, что какая-то реализация по умолчанию содержит отдельные методы, которые мне просто нужно реализовать / переопределить. Я понимаю, что ktor не имеет встроенного DI, поэтому я также ожидаю, что мне придется как-то расширить заглушку routing в моем приложении.

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

Итак, мой вопрос в том, как настроить правильное приложение ktor, реализующее спецификации openapi. Я что-то упускаю или действительно получаю только модель и Paths.kt для работы?

Редактировать

Для большей ясности: особенно с этими частями моего приложения я не рад, что у меня нет поддержки со стороны инструментария:

fun Application.module(testing: Boolean = false) {
    // other setup

    routing {
        // some other interfaces I may have

        FooApiImpl()
    }
}
/**
 * This Api Implementation has to be written completely manually. No help from the generated Code...
 */
@KtorExperimentalLocationsAPI
fun Route.FooApiImpl() {
    get<Paths.getAllFoos> {
        call.respond(listOf(
            Foo( id = -1, bar = "hello"),
            Foo( id = -2, bar = "world")
        ))
    }

    // the path gets named after the first method, which is weird in my eyes.
    post<Paths.getAllFoos> {
        val foo = call.receive<Foo>()
        // fooService.save(foo)
        call.respond(foo)
    }

    delete<Paths.deleteFooById> { path ->
        val id = path.id
        // fooService.deleteById(id)
        call.respond(HttpStatusCode.NoContent)
    }
}

...