如何在Webflux函数端点中获取Locale



我正在使用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
}
}

最新更新