You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:20:30