AcceptHeaderLocaleResolver - до сих пор неясно, как его использовать - PullRequest
0 голосов
/ 13 апреля 2020

Я пытался использовать 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, но мне кажется, что этому классу нужен параметр URL, который содержит параметр "lang", а затем он разрешает использование этого параметра, но я хочу сделать это просто использовать заголовок. Есть ли способ определить перехватчик, который читает только из заголовков язык и позволяет вам получить доступ к этому значению, возможно, через класс LocaleContextHolder?

Кажется, что во всех предыдущих постах / вопросах не хватает кода Я попробовал почти все из них, в результате я получил неработающий код или исключения.

1 Ответ

0 голосов
/ 24 апреля 2020

Неважно ... Я просто настроил свой контроллер следующим образом:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...