ExternalServiceExceptionHandler.kt
package com.example.templateproject.client.exception
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
import org.springframework.web.client.HttpClientErrorException
import org.springframework.web.client.HttpServerErrorException
import tools.jackson.core.JacksonException
import tools.jackson.databind.json.JsonMapper
@Component
class ExternalServiceExceptionHandler(
private val jsonMapper: JsonMapper,
) {
companion object {
private val LOGGER = LoggerFactory.getLogger(ExternalServiceExceptionHandler::class.java)
}
fun getDetails(exception: ExternalServiceException): Map<String, Any> {
val details = mutableMapOf<String, Any>("serviceName" to exception.serviceName)
val responseBody =
when (exception.cause) {
is HttpClientErrorException, is HttpServerErrorException -> exception.cause.responseBodyAsString
else -> null
}
if (!responseBody.isNullOrEmpty()) {
details.putAll(processJsonResponse(responseBody, exception.serviceName))
}
return details
}
private fun processJsonResponse(
response: String,
serviceName: String,
): Map<String, Any> =
try {
val json = jsonMapper.readValue(response, Map::class.java) as Map<String, String>
mapOf("response" to json)
} catch (e: JacksonException) {
LOGGER.warn("[{}] - Failed to parse server response: {}", serviceName, e.message)
mapOf("rawResponse" to response)
}
}