diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index ae77a9aa2d..507e5820d4 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -95,6 +95,23 @@
0.7.3
+
+ uy.kohesive.kovert
+ kovert-vertx
+ [1.5.0,1.6.0)
+
+
+ nl.komponents.kovenant
+ kovenant
+
+
+
+
+ nl.komponents.kovenant
+ kovenant
+ 3.3.0
+ pom
+
@@ -110,4 +127,4 @@
0.10.4
-
\ No newline at end of file
+
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt
new file mode 100644
index 0000000000..da2bbe4208
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt
@@ -0,0 +1,73 @@
+package com.baeldung.kovert
+
+import io.vertx.ext.web.Router
+import io.vertx.ext.web.RoutingContext
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.core.HttpVerb
+import uy.kohesive.kovert.core.Location
+import uy.kohesive.kovert.core.Verb
+import uy.kohesive.kovert.core.VerbAlias
+import uy.kohesive.kovert.vertx.bindController
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+
+class AnnotatedServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(AnnotatedServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ AnnotatedServer().start()
+ }
+ }
+
+ @VerbAlias("show", HttpVerb.GET)
+ class AnnotatedController {
+ fun RoutingContext.showStringById(id: String) = id
+
+ @Verb(HttpVerb.GET)
+ @Location("/ping/:id")
+ fun RoutingContext.ping(id: String) = id
+ }
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", AnnotatedServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ bindController(AnnotatedController(), "api")
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt
new file mode 100644
index 0000000000..a596391ed8
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt
@@ -0,0 +1,75 @@
+package com.baeldung.kovert
+
+import io.vertx.ext.web.Router
+import io.vertx.ext.web.RoutingContext
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.core.HttpErrorCode
+import uy.kohesive.kovert.core.HttpErrorCodeWithBody
+import uy.kohesive.kovert.core.HttpErrorForbidden
+import uy.kohesive.kovert.vertx.bindController
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+
+class ErrorServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(ErrorServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ ErrorServer().start()
+ }
+ }
+
+ class ErrorController {
+ fun RoutingContext.getForbidden() {
+ throw HttpErrorForbidden()
+ }
+ fun RoutingContext.getError() {
+ throw HttpErrorCode("Something went wrong", 590)
+ }
+ fun RoutingContext.getErrorbody() {
+ throw HttpErrorCodeWithBody("Something went wrong", 591, "Body here")
+ }
+ }
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", ErrorServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ bindController(ErrorController(), "api")
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt
new file mode 100644
index 0000000000..310fe2a7a0
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt
@@ -0,0 +1,76 @@
+package com.baeldung.kovert
+
+import com.fasterxml.jackson.annotation.JsonProperty
+import io.vertx.ext.web.Router
+import io.vertx.ext.web.RoutingContext
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.vertx.bindController
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+class JsonServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(JsonServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ JsonServer().start()
+ }
+ }
+
+ data class Person(
+ @JsonProperty("_id")
+ val id: String,
+ val name: String,
+ val job: String
+ )
+
+ class JsonController {
+ fun RoutingContext.getPersonById(id: String) = Person(
+ id = id,
+ name = "Tony Stark",
+ job = "Iron Man"
+ )
+ fun RoutingContext.putPersonById(id: String, person: Person) = person
+ }
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", JsonServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ bindController(JsonController(), "api")
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt
new file mode 100644
index 0000000000..98ce775e66
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt
@@ -0,0 +1,57 @@
+package com.baeldung.kovert
+
+import io.vertx.ext.web.Router
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+class NoopServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(NoopServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ NoopServer().start()
+ }
+ }
+
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", NoopServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt
new file mode 100644
index 0000000000..86ca482808
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt
@@ -0,0 +1,68 @@
+package com.baeldung.kovert
+
+import io.vertx.ext.web.Router
+import io.vertx.ext.web.RoutingContext
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.vertx.bindController
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+
+class SecuredServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(SecuredServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ SecuredServer().start()
+ }
+ }
+
+ class SecuredContext(private val routingContext: RoutingContext) {
+ val authenticated = routingContext.request().getHeader("Authorization") == "Secure"
+ }
+
+ class SecuredController {
+ fun SecuredContext.getSecured() = this.authenticated
+ }
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SecuredServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ bindController(SecuredController(), "api")
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt
new file mode 100644
index 0000000000..172469ab46
--- /dev/null
+++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt
@@ -0,0 +1,65 @@
+package com.baeldung.kovert
+
+import io.vertx.ext.web.Router
+import io.vertx.ext.web.RoutingContext
+import nl.komponents.kovenant.functional.bind
+import org.kodein.di.Kodein
+import org.kodein.di.conf.global
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import uy.klutter.config.typesafe.ClassResourceConfig
+import uy.klutter.config.typesafe.ReferenceConfig
+import uy.klutter.config.typesafe.kodein.importConfig
+import uy.klutter.config.typesafe.loadConfig
+import uy.klutter.vertx.kodein.KodeinVertx
+import uy.kohesive.kovert.vertx.bindController
+import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx
+import uy.kohesive.kovert.vertx.boot.KovertVerticle
+import uy.kohesive.kovert.vertx.boot.KovertVerticleModule
+import uy.kohesive.kovert.vertx.boot.KovertVertx
+
+
+class SimpleServer {
+ companion object {
+ private val LOG: Logger = LoggerFactory.getLogger(SimpleServer::class.java)
+
+ @JvmStatic
+ fun main(args: Array) {
+ SimpleServer().start()
+ }
+ }
+
+ class SimpleController {
+ fun RoutingContext.getStringById(id: String) = id
+ fun RoutingContext.get_truncatedString_by_id(id: String, length: Int = 1) = id.subSequence(0, length)
+ }
+
+ fun start() {
+ Kodein.global.addImport(Kodein.Module {
+ importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SimpleServer::class.java), ReferenceConfig())) {
+ import("kovert.vertx", KodeinKovertVertx.configModule)
+ import("kovert.server", KovertVerticleModule.configModule)
+ }
+
+ // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j
+ import(KodeinVertx.moduleWithLoggingToSlf4j)
+ // Kovert boot
+ import(KodeinKovertVertx.module)
+ import(KovertVerticleModule.module)
+ })
+
+ val initControllers = fun Router.() {
+ bindController(SimpleController(), "api")
+ }
+
+ // startup asynchronously...
+ KovertVertx.start() bind { vertx ->
+ KovertVerticle.deploy(vertx, routerInit = initControllers)
+ } success { deploymentId ->
+ LOG.warn("Deployment complete.")
+ } fail { error ->
+ LOG.error("Deployment failed!", error)
+ }
+
+ }
+}
diff --git a/kotlin-libraries/src/main/resources/kovert.conf b/kotlin-libraries/src/main/resources/kovert.conf
new file mode 100644
index 0000000000..3b08641693
--- /dev/null
+++ b/kotlin-libraries/src/main/resources/kovert.conf
@@ -0,0 +1,15 @@
+{
+ kovert: {
+ vertx: {
+ clustered: false
+ }
+ server: {
+ listeners: [
+ {
+ host: "0.0.0.0"
+ port: "8000"
+ }
+ ]
+ }
+ }
+}