我试图在我的应用程序中使用AcceptHeaderLocaleResolver
。我进行了很多搜索,但是我仍然不知道如何正确使用它。目前,以下代码正在运行:
HeaderLocaleResolver类:
@Component
class HeaderLocaleResolver {
private val acceptHeaderResolver = AcceptHeaderLocaleResolver()
init {
acceptHeaderResolver.defaultLocale = Locale.ENGLISH
}
fun getLocale(request: HttpServletRequest): Locale{
return acceptHeaderResolver.resolveLocale(request)
}
}
我的休息控制器类:
@RequestMapping("/rest/report")
@RestController
class PrinterController(private val printerService: PrinterService,
private val localeResolver: HeaderLocaleResolver) {
@PostMapping("/{folder}/{templateName}")
fun printReport(request: HttpServletRequest,
@PathVariable("folder") folder : String,
@PathVariable("templateName") templateName :String,
@RequestParam("doctype") doctype: DocumentType,
@RequestBody data: String) : ResponseEntity<InputStreamResource> {
val locale = localeResolver.getLocale(request)
val printedReport = printerService.printReport(folder, templateName, doctype, data, locale)
return ResponseEntity.ok().contentType(printedReport.mediaType)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; fileName=" + printedReport.filename)
.body(InputStreamResource(ByteArrayInputStream(printedReport.content)))
}
}
目前,这很好,但是我不明白的是:我真的必须以这种方式使用AcceptHeaderLocaleResolver
类吗?我阅读了很多文章,这些文章显示了如何覆盖LocalChangeInterceptor
的默认配置,但对我来说,该类似乎需要一个包含“ lang”参数的URL参数,然后他决定使用该参数,但我想这样做只是使用标头即可。有没有一种方法可以定义一个仅从标头读取语言的拦截器,然后允许您通过LocaleContextHolder
类访问该值?
[以前的所有帖子/问题似乎都缺少一些代码,由于遇到无法正常工作的代码或异常,我尝试了几乎所有代码/问题。
没关系...我已经这样简单地定义了控制器:
@RequestMapping("/rest/report")
@RestController
class PrinterController(private val printerService: PrinterService) {
@PostMapping("/{folder}/{templateName}", consumes = [MediaType.APPLICATION_JSON_VALUE])
fun printReport(@RequestHeader(name = "accept-language", defaultValue = "en") lang: String,
@PathVariable("folder") folder: String,
@PathVariable("templateName") templateName: String,
@RequestParam("doctype") doctype: DocumentType,
@RequestBody data: String): Mono<ResponseEntity<InputStreamResource>> {
logger.debug{ "Payload to print: $data in language $lang" }
return printerService.printReport(folder, templateName, doctype, data, lang)
.map { report -> ResponseEntity.ok().contentType(report.mediaType)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; fileName=${report.filename}")
.body(InputStreamResource(ByteArrayInputStream(report.content))) }
}
}