对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

web

路由 DSL

Spring Framework 自带一个 Kotlin 路由 DSL,提供三种风格:spring-doc.cadn.net.cn

这些 DSL 允许你编写简洁且符合 Kotlin 习惯的代码,以构建一个 RouterFunction 实例,如下例所示:spring-doc.cadn.net.cn

@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 项目以获取一个具体示例。spring-doc.cadn.net.cn

MockMvc DSL

通过 MockMvc 的 Kotlin 扩展提供了 Kotlin DSL,以提供更符合 Kotlin 习惯的 API,并提升可发现性(无需使用静态方法)。spring-doc.cadn.net.cn

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 Framework 提供了一个 ScriptTemplateView ,它支持 JSR-223,以便使用脚本引擎渲染模板。spring-doc.cadn.net.cn

通过利用 scripting-jsr223 依赖项,可以使用此功能来渲染基于 Kotlin 的模板,例如使用 kotlinx.html DSL 或 Kotlin 多行插值 Stringspring-doc.cadn.net.cn

build.gradle.ktsspring-doc.cadn.net.cn

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

配置通常通过 ScriptTemplateConfigurerScriptTemplateViewResolver Bean 来完成。spring-doc.cadn.net.cn

KotlinScriptConfiguration.ktspring-doc.cadn.net.cn

@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 示例项目。spring-doc.cadn.net.cn

Kotlin 多平台序列化

从 Spring Framework 5.3 起,Kotlin 多平台序列化 已在 Spring MVC、Spring WebFlux 和 Spring Messaging(RSocket)中得到支持。内置支持目前针对 CBOR、JSON 和 ProtoBuf 格式。spring-doc.cadn.net.cn

要启用它,请按照这些说明添加相关的依赖项和插件。 对于 Spring MVC 和 WebFlux,如果类路径中同时包含 Kotlin 序列化库和 Jackson,则两者都会默认被配置, 因为 Kotlin 序列化旨在仅序列化带有 @Serializable 注解的 Kotlin 类。 对于 Spring Messaging(RSocket),如果您希望使用自动配置,请确保类路径中不包含 Jackson、GSON 或 JSONB; 如果需要使用 Jackson,请手动配置 KotlinSerializationJsonMessageConverterspring-doc.cadn.net.cn