Spring Web MVC ServerRequest urlencoded body в класс данных с использованием Kotlin

TL;DR

Как я могу преобразовать ServerRequest urlencoded body в класс данных в котлине?

Каждый раз, когда я звоню request.body<MyDataClass>() или request.body(MyDataClass::class.java) Я получаю HttpMediaTypeNotSupportedException

Детали

В весенней загрузке v2.2.6.RELEASEЯ использую DSL-маршрутизатор WebMvc.fn для обработки простого метода POST, поступающего из формы. Текст запроса:x-www-form-urlencoded. Мне не удалось преобразовать данные формы с помощьюServerRequest.body функции для data class.

Каждый раз, когда я звоню request.body<MyDataClass>() или request.body(MyDataClass::class.java) Я получаю исключение

org.springframework.web.HttpMediaTypeNotSupportedException: 
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

Я пробовал использовать FormHttpMessageConverter, но он преобразуется только в MultiValueMap<String, String>.

Код

Приложение Spring

@SpringBootApplication
class TestApplication

fun main(args: Array<String>) {
    runApplication<TestApplication>(*args) {
        addInitializers(beans())
    }
}

Определения фасоли

fun beans(): BeanDefinitionDsl = beans {
    bean<FormHttpMessageConverter>()
    bean<RegistrationHandler>()
    bean<RegistrationForm>()
    bean(::mainRouter)
}

Функция маршрутизатора

fun mainRouter(registrationHandler: RegistrationHandler) = router {
    "/register".nest {
        GET("/") { ok().render("registration") }
        POST("/", registrationHandler::processRegistration)
    }
}

Обработчик

class RegistrationHandler { 
    fun processRegistration(request: ServerRequest): ServerResponse {
        val form = request.body<RegistrationForm>()
        // val map = request.body<MultiValueMap<String, String>>() <== this works!
        return ok().render("redirect:/login")
    }
}

Класс данных

data class RegistrationForm(
    val username: String = "",
    val password: String = ""
) 

Форма Html с использованием тимелеафа

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<body>
<form method="POST" th:action="@{/register}" id="registerForm">
    <label for="username">Username: </label>
    <input type="text" name="username"/><br/>

    <label for="password">Password: </label>
    <input type="password" name="password"/><br/>

    <label for="confirm">Confirm password: </label>
    <input type="password" name="confirm"/><br/>

    <input type="submit" value="Register"/>
</form>

</body>
</html>

0 ответов

Другие вопросы по тегам