我正在使用Spring的Functional Endpoints和Kotlin来创建一个web服务,并且我正在尝试找出使用标准Accept-Language
标头来解析Locale
的惯用方法。
下面是代码的一个示例:
val repository: PersonRepository = ...
val handler = PersonHandler(repository)
val route = coRouter {
GET("/person", handler::getPeople)
}
class PersonHandler(private val repository: PersonRepository) {
suspend fun getPeople(request: ServerRequest): ServerResponse {
val locale = /* ??? */
// create and return response
}
}
Spring文档引用使用LocaleContextResolver
作为请求的一部分解析Locale
,但在使用Functional Endpoints时,我看不到使用它的方法。您可以获得传递到ServiceRequest.headers().acceptLanguage()
的Accept-Language
标头中的原始值,如下所示…
suspend fun getPeople(request: ServerRequest): ServerResponse {
val locale =
Locale.lookup(request.headers().acceptLanguage(), supportedLocales)
?: Locale.getDefault()
// create and return response
}
但这不就是在每个处理程序函数中重新实现LocaleContextResolver
的职责吗?
在Spring的Functional Endpoints中,将Accept-Language
标头转换为单个/最好支持的Locale
的惯用方法是什么
我可以使用before
过滤器:
val repository: PersonRepository = ...
val handler = PersonHandler(repository)
val route = coRouter {
GET("/person", handler::getPeople)
before(::parseLocale)
}
fun parseLocale(request: ServerRequest): ServerRequest {
val locale = try {
Locale.lookup(request.headers().acceptLanguage(), wellKnownSupportedLocales) ?: wellKnownDefaultLocale
} catch (exception: RuntimeException) {
wellKnownDefaultLocale
}
return ServerRequest
.from(request)
.attribute("locale", locale)
.body(request.bodyToFlux())
.build()
}
class PersonHandler(private val repository: PersonRepository) {
suspend fun getPeople(request: ServerRequest): ServerResponse {
val locale = request.attributes("locale").get() as Locale
// create and return response
}
}