Spring Web MVC ServerRequest urlen-кодированное тело для класса данных, используя Kotlin - PullRequest
0 голосов
/ 13 апреля 2020

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>
...