SpringMvc Get请求传入枚举类型
spring默认的枚举转换器是 StringToEnumConverterFactory
通过 Enum.valueOf(this.enumType, source.trim())
进行转换
当枚举的值是数字时,会报错
创建自定义枚举 IEnum
import java.io.Serializable
/**
* 通用枚举接口,定义了枚举的基本行为和属性。
*
* @param <V> 枚举值的类型,该类型需实现Serializable接口,以便于序列化和反序列化。
* @param <E> 子枚举类型,指明实现该接口的具体枚举类。
*/
interface IEnum<V : Serializable> {
/**
* 获取枚举项的值。该属性被[@JsonValue]注解标记,用于在JSON序列化和反序列化时使用。
*/
@get:JsonValue
val value: V
/**
* 从值反序列化枚举。这是一个companion object方法,用于根据提供的值查找并返回对应的枚举常量。
*
* @param value 要查找的枚举值。
* @param B 实现IEnum接口的枚举类。
* @return 找到的枚举常量,如果未找到则返回null。
*/
companion object {
inline fun <reified B, V> Class<B>.fromValue(value: V): B?
where B : IEnum<V>, V : Serializable {
return enumConstants?.asSequence()
?.filter { it.value == value } // 筛选出值匹配的枚举常量
?.firstOrNull() // 获取第一个匹配项,若无则返回null
}
}
}
创建枚举转换工厂 EnumConvertFactory
import org.springframework.core.convert.converter.Converter
import org.springframework.core.convert.converter.ConverterFactory
/**
* 枚举转换工厂类,用于将字符串转换为指定的枚举类型。
*/
class EnumConvertFactory : ConverterFactory<String, IEnum<*>> {
/**
* 获取一个转换器,用于将字符串转换为指定的枚举类型T。
*
* @param targetType 转换目标枚举类型的Class对象。
* @return 返回一个字符串到枚举类型的转换器。
*/
override fun <T : IEnum<*>> getConverter(targetType: Class<T>): Converter<String, T> {
return Converter { source ->
// 尝试找到与给定字符串匹配的枚举常量,如果没有找到则返回null。
targetType.enumConstants.firstOrNull { it.value.toString() == source }
}
}
}
注册转换器
import org.springframework.context.annotation.Configuration
import org.springframework.format.FormatterRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
/**
* WebMvc配置类,用于配置Spring MVC的一些行为。
*/
@Configuration
class WebMvcConfiguration : WebMvcConfigurer {
/**
* @param registry 格式化器注册表,用于注册转换器。
*/
override fun addFormatters(registry: FormatterRegistry) {
registry.addConverterFactory(EnumConvertFactory())
}
}
基于以上的配置,在控制器方法中,可以使用Get
请求来接收实现IEnum的枚举类型的参数。