При попытке сгенерировать заглушки на стороне сервера для 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)
}
}