diff --git a/daemon/build.gradle.kts b/daemon/build.gradle.kts index 02d0ab91..6dc58106 100644 --- a/daemon/build.gradle.kts +++ b/daemon/build.gradle.kts @@ -90,6 +90,7 @@ dependencies { implementation("org.springframework:spring-context-indexer") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") implementation("org.hibernate.orm:hibernate-community-dialects") implementation("org.jetbrains.kotlin:kotlin-stdlib") implementation("com.squareup.okhttp3:okhttp:4.10.0") diff --git a/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/ActuatorHttpClientImpl.kt b/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/ActuatorHttpClientImpl.kt index a43fcc65..67b468b5 100644 --- a/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/ActuatorHttpClientImpl.kt +++ b/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/ActuatorHttpClientImpl.kt @@ -2,6 +2,7 @@ package dev.krud.boost.daemon.actuator import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.dataformat.xml.XmlMapper import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.KotlinModule import dev.krud.boost.daemon.actuator.model.BeansActuatorResponse @@ -44,6 +45,7 @@ import dev.krud.boost.daemon.okhttp.ProgressResponseBody import okhttp3.Authenticator import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request @@ -67,6 +69,15 @@ class ActuatorHttpClientImpl( configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) } + internal val xmlMapper = XmlMapper().apply { + registerModule(JavaTimeModule()) + registerModule(KotlinModule.Builder().build()) + registerModule( + MultiDateParsingModule() + ) + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + } + private val baseHttpUrl: HttpUrl = baseUrl.toHttpUrl() override fun testConnection(): TestConnectionResponse { @@ -327,7 +338,11 @@ class ActuatorHttpClientImpl( if (responseBody == null) { throwInternalServerError("Actuator response body is null: $request") } else { - objectMapper.readValue(responseBody, Type::class.java) + if (response.contentType()?.subtype?.contains("xml") == true) { + xmlMapper.readValue(responseBody, Type::class.java) + } else { + objectMapper.readValue(responseBody, Type::class.java) + } } } } @@ -401,6 +416,8 @@ class ActuatorHttpClientImpl( } } + private fun Response.contentType(): MediaType? = body?.contentType() + private fun getClient(block: OkHttpClient.Builder.() -> Unit = {}): OkHttpClient = OkHttpClient .Builder() .authenticator(authenticator) diff --git a/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/model/EndpointsActuatorResponse.kt b/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/model/EndpointsActuatorResponse.kt index 77030714..fbfd3636 100644 --- a/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/model/EndpointsActuatorResponse.kt +++ b/daemon/src/main/kotlin/dev/krud/boost/daemon/actuator/model/EndpointsActuatorResponse.kt @@ -2,9 +2,11 @@ package dev.krud.boost.daemon.actuator.model import com.fasterxml.jackson.annotation.JsonProperty import dev.krud.boost.daemon.utils.TypeDefaults +import jakarta.xml.bind.annotation.XmlElement data class EndpointsActuatorResponse( @JsonProperty("_links") + @XmlElement(name = "_links") val links: Map = emptyMap() ) { data class Link(