gpt4 book ai didi

spring-boot - 如何在 Spring 中将 WWW 表单字段反序列化为枚举?

转载 作者:行者123 更新时间:2023-12-02 12:59:05 29 4
gpt4 key购买 nike

在 Kotlin 中尝试将来自 WWW 表单的输入反序列化为 Spring 应用程序中的枚举类时,我遇到了问题。

我的 DTO 和枚举类:

enum class Status(@get:JsonValue val value: Int) {
NORMAL(0),
ERROR(1);

companion object {
@JvmStatic
@JsonCreator
fun of(number: Int?): Status? {
return values().find { it.value == number }
}
}
}

data class RequestData(val status: Status?)

Controller 的 POST 请求接收方法:
@PostMapping("/post")
fun register(@Valid data: RequestData, error: Errors) {}

当我使用 status = 0 发出 POST 请求时使用 Postman,请求失败并出现以下异常。
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.example.Controller.post, parameter data

当我向 status = NORMAL 提出请求时那么也不异常(exception),但那是我不想要的。
我正在使用 application/x-www-form-urlencoded POST 请求中的内容类型。
请让我知道我在哪里做错了。

最佳答案

您可以为此使用 Converter 类。请注意,请求参数在您看来就像一个数字,但它们实际上是字符串。这就是为什么下面的转换器接受 String?并返回 Status? .这意味着,如果您的 enum也接受它。示例:NORMAL("0"), ERROR("1") .

class ConvStringToStatus : Converter<String?, Status?> {
override fun convert(source: String?) = Status.of(source)
}

为了使它工作,转换器必须如下注册。
@Configuration
class WebConfig : WebMvcConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
registry.addConverter(ConvStringToStatus())
}
}

关于spring-boot - 如何在 Spring 中将 WWW 表单字段反序列化为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53183291/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com