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/"))
	}
}
这个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 Framework提供了一个支持JSR-223ScriptTemplateView,用于通过脚本引擎渲染模板。

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

build.gradle.kts

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

通常使用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-script-templating示例项目以获取更多详细信息。

Kotlin多平台序列化

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

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