Home > Software design >  Problems with database connection Ktor!!! I just don't understand why the ktor not to see the p
Problems with database connection Ktor!!! I just don't understand why the ktor not to see the p

Time:04-08

I'm having a problem with my web project. It is my first time when i try connecting database. I want to connect database to see that working. I use Postgres and have set up a database. I want to connect by using the following code :

Data base settings
package com.testreftul

import com.testreftul.model.Orders
import com.testreftul.model.Products
import com.testreftul.model.User
import com.typesafe.config.ConfigFactory
import io.ktor.server.config.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.transactions.transaction

object DbSettings {
    private val appConfig = HoconApplicationConfig(ConfigFactory.load())
    private var dbUrl = appConfig.property("jbdc.url").getString()
    private var dbUser = appConfig.property("jbdc.username").getString()
    private var dbPassword = appConfig.property("jbdc.password").getString()

    fun init(dbUrl: String, dbUser: String, dbPassword: String) {
        this.dbUrl = dbUrl
        this.dbUser = dbUser
        this.dbPassword = dbPassword
        pgConnection()
        transaction {
            SchemaUtils.create(User, Products, Orders)
        }
    }

    private fun pgConnection() = Database.connect(
        url = dbUrl,
        driver = "org.postgresql.Driver",
        user = dbUser,
        password = dbPassword
    )
    suspend fun <T> dbQuery(block:()->T): T =
        withContext(Dispatchers.IO){
            transaction {
                block()
            }
        }
}
Database plugin
package com.testreftul.plugins

import com.testreftul.DbSettings
import io.ktor.server.application.*

fun Application.connectDatabase(){
    val url = environment.config.property("jdbc.url").getString()
    val username = environment.config.property("jdbc.username").getString()
    val password = environment.config.property("jdbc.password").getString()

    DbSettings.init(url,username,password)
}
Application.conf
ktor {
    deployment {
        port = 8080
        port = ${?PORT}
    }
    application {
        modules = [ com.testreftul.ApplicationKt.module ]
    }
}

jdbc{
        url =  "jdbc:postgresql://localhost:5432/restest"
        username = "postgres"
        password = "admin"
}
build.gradle.kts
val ktor_version: String by project
val kotlin_version: String by project
val logback_version: String by project
val exposed_version:String by project
val postgresql_jdbc:String by project
plugins {
    application
    kotlin("jvm") version "1.6.20"
    id("org.jetbrains.kotlin.plugin.serialization") version "1.6.20"
}

group = "com.testreftul"
version = "0.0.1"
application {
    mainClass.set("io.ktor.server.netty.EngineMain")

    val isDevelopment: Boolean = project.ext.has("development")
    applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

repositories {
    mavenCentral()
    maven { url = uri("https://maven.pkg.jetbrains.space/public/p/ktor/eap") }
}

dependencies {
    implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-content-negotiation-jvm:$ktor_version")
    implementation("io.ktor:ktor-serialization-kotlinx-json-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-netty-jvm:$ktor_version")
    implementation("ch.qos.logback:logback-classic:$logback_version")

    implementation ("org.jetbrains.exposed:exposed-core:$exposed_version")
    implementation ("org.jetbrains.exposed:exposed-dao:$exposed_version")
    implementation ("org.jetbrains.exposed:exposed-jdbc:$exposed_version")
    implementation ("org.jetbrains.exposed:exposed-java-time:$exposed_version")
    implementation ("org.postgresql:postgresql:$postgresql_jdbc")

    testImplementation("io.ktor:ktor-server-tests-jvm:$ktor_version")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")


}
gradle.properties
ktor_version=2.0.0-beta-1
kotlin_version=1.6.20
logback_version=1.2.3
kotlin.code.style=official

exposed_version=0.37.3
postgresql_jdbc=42.3.3
Application.kt

package com.testreftul

import io.ktor.server.application.*
import com.testreftul.plugins.*

fun main(args: Array<String>): Unit =
    io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // application.conf references the main function. This annotation prevents the IDE from marking it as unused.
fun Application.module() {
    connectDatabase()
    configureRouting()
    configureSerialization()
}

I installed all the plugins that were needed and created a database,and also i configure my ide and connect to database with dialect postgres.When i run the console return Caused by: io.ktor.server.config.ApplicationConfigurationException: Property jbdc.url not found.

> Task :run FAILED
2022-04-06 01:55:22.805 [main] TRACE Application - {
    # application.conf @ file:/C:/Users/eljan/IdeaProjects/ktor-restful1/build/resources/main/application.conf: 6
    "application" : {
        # application.conf @ file:/C:/Users/eljan/IdeaProjects/ktor-restful1/build/resources/main/application.conf: 7
        "modules" : [
            # application.conf @ file:/C:/Users/eljan/IdeaProjects/ktor-restful1/build/resources/main/application.conf: 7
            "com.testreftul.ApplicationKt.module"
        ]
    },
    # application.conf @ file:/C:/Users/eljan/IdeaProjects/ktor-restful1/build/resources/main/application.conf: 2
    "deployment" : {
        # application.conf @ file:/C:/Users/eljan/IdeaProjects/ktor-restful1/build/resources/main/application.conf: 3
        "port" : 8080
    },
    # Content hidden
    "security" : "***"
}

2022-04-06 01:55:22.976 [main] INFO  Application - Autoreload is disabled because the development mode is off.
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.testreftul.plugins.DatabaseKt.connectDatabase(Database.kt:11)
    at com.testreftul.ApplicationKt.module(Application.kt:11)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97)
    at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Static.call(CallerImpl.kt:106)
    at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:108)
    at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:159)
    at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:112)
    at io.ktor.server.engine.internal.CallableUtilsKt.callFunctionWithInjection(CallableUtils.kt:119)
    at io.ktor.server.engine.internal.CallableUtilsKt.executeModuleFunction(CallableUtils.kt:36)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$launchModuleByName$1.invoke(ApplicationEngineEnvironmentReloading.kt:333)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$launchModuleByName$1.invoke(ApplicationEngineEnvironmentReloading.kt:332)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.avoidingDoubleStartupFor(ApplicationEngineEnvironmentReloading.kt:357)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.launchModuleByName(ApplicationEngineEnvironmentReloading.kt:332)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.access$launchModuleByName(ApplicationEngineEnvironmentReloading.kt:32)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$instantiateAndConfigureApplication$1.invoke(ApplicationEngineEnvironmentReloading.kt:313)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading$instantiateAndConfigureApplication$1.invoke(ApplicationEngineEnvironmentReloading.kt:311)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.avoidingDoubleStartup(ApplicationEngineEnvironmentReloading.kt:339)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.instantiateAndConfigureApplication(ApplicationEngineEnvironmentReloading.kt:311)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.createApplication(ApplicationEngineEnvironmentReloading.kt:144)
    at io.ktor.server.engine.ApplicationEngineEnvironmentReloading.start(ApplicationEngineEnvironmentReloading.kt:278)
    at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:183)
    at io.ktor.server.netty.EngineMain.main(EngineMain.kt:26)
Caused by: io.ktor.server.config.ApplicationConfigurationException: Property jbdc.url not found.
    at io.ktor.server.config.HoconApplicationConfig.property(HoconApplicationConfig.kt:15)
    at com.testreftul.DbSettings.<clinit>(DbSettings.kt:16)
    ... 26 more
Caused by: io.ktor.server.config.ApplicationConfigurationException: Property jbdc.url not found.


Execution failed for task ':run'.
> Process 'command 'C:\Users\eljan\.jdks\corretto-16.0.2\bin\java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

CodePudding user response:

You have a typo in config's property names in the definition of default values for private variables. It should be jdbc instead of jbdc:

private var dbUrl = appConfig.property("jbdc.url").getString()
private var dbUser = appConfig.property("jbdc.username").getString()
private var dbPassword = appConfig.property("jbdc.password").getString()
  • Related