TL; DR
Как я могу преобразовать ServerRequest
urlencoded тело в класс данных в Kotlin?
Каждый раз, когда я звоню request.body<MyDataClass>()
или request.body(MyDataClass::class.java)
Я получаю HttpMediaTypeNotSupportedException
Подробности
В Spring Boot v2.2.6.RELEASE
Я использую Web Mvc .fn DSL router для обработки простой метод 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>