Довольно часто значения enum должны быть написаны маленькими буквами, но Kotlin ожидает большими. Поэтому такое поведение нужно дополнительно настраивать.
Если нужно использовать enum в теле запроса или ответа, то это выглядит так:
import com.fasterxml.jackson.annotation.JsonValue
enum class SampleEnum(@field:JsonValue val value: String) {
VALUE_1("value_1"),
OTHER("other"),
}
(вместо field
можно так же get
использовать; надеюсь, что в каком-то будущем такой префикс будет вообще не нужен)
Но если этот же перечисление попробовать использовать в запросе (query params), то так не сработает. Почему? Для тела запроса и ответа используется JSON (и соответствующая библиотека), а для query params используется Spring-специфичный механизм преобразования.
Тем не менее, можно написать универсальный преобразователь для enum (идея народная, реализация на Kotlin моя):
@Component
class JacksonEnumConverter(private val mapper: ObjectMapper): GenericConverter {
private val types = setOf(
ConvertiblePair(String::class.java, Enum::class.java),
)
override fun getConvertibleTypes() = types
override fun convert(
source: Any?,
sourceType: TypeDescriptor,
targetType: TypeDescriptor,
): Any? {
if (source == null) return null
try {
return mapper.readValue("\"$source\"", targetType.type)
} catch (e: IOException) {
throw IllegalArgumentException(
"Conversion failed for $source to ${targetType.name}",
e
)
}
}
}