Web
路由器DSL
Spring框架提供三种不同类型的Kotlin路由器DSL
这些DSL允许您编写简洁且符合Kotlin习惯的代码来构建RouterFunction
实例,如下例所示。
@Configuration
class RouterRouterConfiguration {
@Bean
fun mainRouter(userHandler: UserHandler) = router {
accept(TEXT_HTML).nest {
GET("/") { ok().render("index") }
GET("/sse") { ok().render("sse") }
GET("/users", userHandler::findAllView)
}
"/api".nest {
accept(APPLICATION_JSON).nest {
GET("/users", userHandler::findAll)
}
accept(TEXT_EVENT_STREAM).nest {
GET("/users", userHandler::stream)
}
}
resources("/**", ClassPathResource("static/"))
}
}
此DSL是程序化的,这意味着它允许通过if 表达式、for 循环或任何其他Kotlin结构来进行Bean的自定义注册逻辑。当您需要根据动态数据(例如,来自数据库)注册路由时,这非常有用。 |
请参阅MiXiT项目以了解具体的示例。
MockMvc DSL
通过MockMvc
Kotlin扩展提供Kotlin DSL,以便提供更符合Kotlin习惯的API并提高可发现性(不使用静态方法)。
val mockMvc: MockMvc = ...
mockMvc.get("/person/{name}", "Lee") {
secure = true
accept = APPLICATION_JSON
headers {
contentLanguage = Locale.FRANCE
}
principal = Principal { "foo" }
}.andExpect {
status { isOk }
content { contentType(APPLICATION_JSON) }
jsonPath("$.name") { value("Lee") }
content { json("""{"someBoolean": false}""", false) }
}.andDo {
print()
}
Kotlin脚本模板
Spring框架提供了一个ScriptTemplateView
,它支持JSR-223 通过使用脚本引擎来渲染模板。
通过利用scripting-jsr223
依赖项,可以使用此功能使用kotlinx.html DSL或Kotlin多行插值String
来渲染基于Kotlin的模板。
build.gradle.kts
dependencies {
runtime("org.jetbrains.kotlin:kotlin-scripting-jsr223:${kotlinVersion}")
}
配置通常使用ScriptTemplateConfigurer
和ScriptTemplateViewResolver
Bean完成。
KotlinScriptConfiguration.kt
@Configuration
class KotlinScriptConfiguration {
@Bean
fun kotlinScriptConfigurer() = ScriptTemplateConfigurer().apply {
engineName = "kotlin"
setScripts("scripts/render.kts")
renderFunction = "render"
isSharedEngine = false
}
@Bean
fun kotlinScriptViewResolver() = ScriptTemplateViewResolver().apply {
setPrefix("templates/")
setSuffix(".kts")
}
}
有关更多详细信息,请参阅kotlin-script-templating示例项目。
Kotlin多平台序列化
Spring MVC、Spring WebFlux和Spring Messaging(RSocket)支持Kotlin多平台序列化。内置支持当前针对CBOR、JSON和ProtoBuf格式。
要启用它,请按照这些说明添加相关的依赖项和插件。对于Spring MVC和WebFlux,如果Kotlin序列化在类路径中,则默认情况下会配置Kotlin序列化和Jackson,因为Kotlin序列化旨在仅序列化用@Serializable
注解的Kotlin类。对于Spring Messaging(RSocket),如果您想要自动配置,请确保类路径中没有Jackson、GSON或JSONB,如果需要Jackson,请手动配置KotlinSerializationJsonMessageConverter
。