在Kotlin中使用Jackson反序列化枚举遇到问题求助
解决Kotlin枚举在Spring Boot中序列化正常但反序列化(@RequestParam)失败的问题
问题原因
你遇到的核心问题是:@RequestParam的参数解析逻辑不依赖Jackson,而是由Spring自带的ConversionService处理。你之前用的@JsonProperty或@JsonValue只对请求体/响应体的JSON序列化/反序列化生效,对URL参数的解析完全不起作用,所以反序列化"Typ A"时会默认尝试调用枚举的valueOf()方法,自然找不到匹配的枚举常量。
解决方案
需要同时适配Jackson的JSON处理和Spring的URL参数解析,分两步处理:
1. 适配Jackson的JSON序列化/反序列化(请求体、响应体)
给枚举添加@JsonValue定义序列化输出,再用@JsonCreator标注静态方法处理反序列化:
import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonValue enum class Type(@JsonValue val value: String) { TypeA("Typ A"), TypeB("Typ B"); @JsonCreator companion object { fun fromValue(input: String): Type { return values().firstOrNull { it.value == input } ?: throw IllegalArgumentException("无效的Type值: $input") } } }
这样请求体里的JSON字符串就能正常反序列化为枚举,响应体的枚举也会输出指定的字符串。
2. 适配@RequestParam的参数解析
实现Spring的Converter<String, Type>接口,让Spring能把URL参数的字符串转换成枚举实例:
import org.springframework.core.convert.converter.Converter import org.springframework.stereotype.Component @Component class StringToTypeConverter : Converter<String, Type> { override fun convert(source: String): Type { return Type.fromValue(source) } }
把这个Converter注册为Spring组件后,Spring处理@RequestParam时就会用它来转换参数,而不是默认的valueOf()方法。
可选优化
如果需要支持忽略大小写解析(比如"typ a"也能匹配TypeA),可以修改fromValue方法的判断逻辑:
fun fromValue(input: String): Type { return values().firstOrNull { it.value.equals(input, ignoreCase = true) } ?: throw IllegalArgumentException("无效的Type值: $input") }
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

