我有一个示例 ktor 应用程序,我想在其中测试 PostgreSQL 连接。找不到我错过的点。 Docker 撰写文件正常,容器已启动。当我在本地运行时出现错误。看来问题出在 application.yml 上,但不确定。
build.gradle
dependencies {
implementation "io.ktor:ktor-server-core-jvm"
implementation "io.ktor:ktor-server-netty-jvm"
implementation "ch.qos.logback:logback-classic:$logback_version"
implementation "io.ktor:ktor-server-config-yaml"
testImplementation "io.ktor:ktor-server-tests-jvm"
testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
implementation "org.jetbrains.exposed:exposed-core:0.50.1"
implementation "org.jetbrains.exposed:exposed-dao:0.50.1"
implementation "org.jetbrains.exposed:exposed-jdbc:0.50.1"
implementation "com.zaxxer:HikariCP:4.0.3"
implementation 'org.postgresql:postgresql:42.1.4'
}
docker-compose.yml
version: '3.7'
services:
database:
image: postgres:14-alpine
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=123456
- POSTGRES_USER=user
- POSTGRES_DB=project1
expose:
- "5432"
application.yml
ktor:
application:
modules:
- com.activity.ApplicationKt.module
deployment:
port: 8080
database:
url:
-jdbc:postgresql://database:5432/project1
driver:
-org.postgresql.Driver
username:
-user
password:
-123456
例外
Exception in thread "main" net.mamoe.yamlkt.YamlDecodingException: Top-level decoder: deserializing nested class for '1' in 'kotlin.collections.LinkedHashMap'
username:
^ at line 12, column 18
at net.mamoe.yamlkt.internal.YamlUtils__ContextualExceptionKt.contextualDecodingException(ContextualException.kt:165)
at net.mamoe.yamlkt.internal.YamlUtils.contextualDecodingException(Unknown Source)
at net.mamoe.yamlkt.internal.YamlDecoder$AbstractDecoder.decodeSerializableElement(YamlDecoder.kt:206)
at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:533)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:111)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:84)
at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
at net.mamoe.yamlkt.internal.YamlElementMapSerializer.deserialize(YamlElementSerializer.kt)
at net.mamoe.yamlkt.internal.YamlElementSerializer.deserialize(YamlElementSerializer.kt:40)
at net.mamoe.yamlkt.internal.YamlElementSerializer.deserialize(YamlElementSerializer.kt:30)
at net.mamoe.yamlkt.Yaml.decodeFromString(Yaml.kt:162)
at net.mamoe.yamlkt.Yaml.decodeYamlFromString(Yaml.kt:175)
at io.ktor.server.config.yaml.YamlConfigJvmKt.configFromString(YamlConfigJvm.kt:36)
at io.ktor.server.config.yaml.YamlConfigJvmKt.YamlConfig(YamlConfigJvm.kt:25)
at io.ktor.server.config.yaml.YamlConfigLoader.load(YamlConfig.kt:21)
at io.ktor.server.config.ConfigLoader$Companion.load(ConfigLoaders.kt:33)
at io.ktor.server.config.ConfigLoader$Companion.load$default(ConfigLoaders.kt:26)
at io.ktor.server.engine.CommandLineKt.buildApplicationConfig(CommandLine.kt:112)
at io.ktor.server.engine.CommandLineKt.buildCommandLineEnvironment(CommandLine.kt:33)
at io.ktor.server.engine.CommandLineKt.commandLineEnvironment(CommandLine.kt:98)
at io.ktor.server.netty.EngineMain.main(EngineMain.kt:20)
at com.activity.ApplicationKt.main(Application.kt:7)
Caused by: net.mamoe.yamlkt.YamlDecodingException: Top-level decoder: deserializing nested class for '5' in 'kotlin.collections.LinkedHashMap'
... -org.postgresql.Driver
^ at line 11, column 35
at net.mamoe.yamlkt.internal.YamlUtils__ContextualExceptionKt.contextualDecodingException(ContextualException.kt:165)
at net.mamoe.yamlkt.internal.YamlUtils.contextualDecodingException(Unknown Source)
at net.mamoe.yamlkt.internal.YamlDecoder$AbstractDecoder.decodeSerializableElement(YamlDecoder.kt:206)
at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:533)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:111)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:84)
at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
at net.mamoe.yamlkt.internal.YamlElementMapSerializer.deserialize(YamlElementSerializer.kt)
at net.mamoe.yamlkt.internal.YamlElementSerializer.deserialize(YamlElementSerializer.kt:40)
at net.mamoe.yamlkt.internal.YamlElementSerializer.deserialize(YamlElementSerializer.kt:30)
at net.mamoe.yamlkt.internal.YamlDecoder$AbstractDecoder.decodeSerializableElement(YamlDecoder.kt:204)
... 21 more
Caused by: net.mamoe.yamlkt.YamlDecodingException: Top-level decoder: deserializing nested class for '1' in 'kotlin.collections.LinkedHashMap'
driver:
^ at line 10, column 16
.......
我认为,您的
yaml
键对于数据库连接来说是错误的:
application.yml
ktor:
application:
modules:
- com.activity.ApplicationKt.module
deployment:
port: 8080
database:
url: "jdbc:postgresql://database:5432/project1"
driverClass: "org.postgresql.Driver"
user: "user"
password: "123456"
您还可以省略列表格式
-
,因为您只有一个值。我已将值更改为普通字符串。