AcceptHeaderLocaleResolver-尚不清楚如何使用它

问题描述 投票:0回答:1

我试图在我的应用程序中使用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类访问该值?

[以前的所有帖子/问题似乎都缺少一些代码,由于遇到无法正常工作的代码或异常,我尝试了几乎所有代码/问题。

kotlin internationalization spring-restcontroller
1个回答
0
投票

没关系...我已经这样简单地定义了控制器:

@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))) }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.