Как десериализовать поле формы WWW для перечисления весной? - PullRequest
0 голосов
/ 07 ноября 2018

Я столкнулся с проблемой при попытке десериализации ввода, поступающего из WWW-формы, в enum-класс в приложении Spring в Kotlin.

Мои классы DTO и enum:

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?)

Метод получения запроса POST контроллера:

@PostMapping("/post")
fun register(@Valid data: RequestData, error: Errors) {}

Когда я делаю POST-запрос с status = 0, используя Почтальон, запрос завершается с ошибкой со следующим исключением.

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.example.Controller.post, parameter data

Когда я делаю запрос с status = NORMAL, тогда не исключение, но это то, что я не хочу. Я использую application/x-www-form-urlencoded тип контента в запросе POST. Пожалуйста, дайте мне знать, где я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Для этого вы можете использовать класс 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())
    }
}
0 голосов
/ 07 ноября 2018

Вы просто используете имя.

ex) status = NORMAL

И имеет ли значение value? Вы можете использовать порядковый номер

enum class Status{
    NORMAL,
    ERROR,
}

println(NORMAL.ordinal)
//result:0

Это шутка, но если вам нужно

enum class Status(val value:String){
    `0`("NORMAL"),`1`("ERROR")
}

println(data.status.value)
...