跳到主要内容

Web

ChatGPT-4o 中英对照 Web

路由器 DSL

Spring Framework 提供了三种风格的 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/"))
}
}
kotlin
备注

这个 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

Kotlin 脚本模板

Spring Framework 提供了一个 ScriptTemplateView,它支持 JSR-223,可以通过使用脚本引擎来渲染模板。

通过利用 scripting-jsr223 依赖,可以使用此功能通过 kotlinx.html DSL 或 Kotlin 多行插值 String 来渲染基于 Kotlin 的模板。

build.gradle.kts

dependencies {
runtime("org.jetbrains.kotlin:kotlin-scripting-jsr223:${kotlinVersion}")
}
kotlin

配置通常通过 ScriptTemplateConfigurerScriptTemplateViewResolver 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

请参阅 kotlin-script-templating 示例项目以获取更多详细信息。

Kotlin 多平台序列化

Kotlin 多平台序列化 在 Spring MVC、Spring WebFlux 和 Spring Messaging (RSocket) 中得到支持。内置支持目前针对 CBOR、JSON 和 ProtoBuf 格式。

要启用它,请按照这些说明添加相关的依赖和插件。对于 Spring MVC 和 WebFlux,如果 Kotlin serialization 和 Jackson 在类路径中,它们将默认配置,因为 Kotlin serialization 旨在仅序列化用 @Serializable 注解的 Kotlin 类。对于 Spring Messaging (RSocket),如果您希望自动配置,请确保 Jackson、GSON 或 JSONB 均不在类路径中;如果需要 Jackson,请手动配置 KotlinSerializationJsonMessageConverter