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>