Как сделать, чтобы вводимый объектный маппер выводился в зависимости от локали - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть REST-контроллер Spring Boot с методом

  @GetMapping(value = "/validate", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
  @ResponseBody
  public Result validate(
      @ApiParam(value = "http://example.org/test", required = true) @RequestParam String iri,
      @Context HttpServletRequest request
  ) {
    return service.validate(iri);
  }
...

и пользовательский сопоставитель объектов, настроенный как (Result класс является частью сторонней библиотеки)

  @Bean
  public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
    SimpleModule module = new SimpleModule();
    module.addSerializer(Result.class, new ResultSerializer());
    mapper.registerModule(module);
    return mapper;
  }

Внутри ResultSerializer (моя пользовательская реализация) Мне нужно настроить вывод сериализации на основе заголовка Accept-language (например, из ограничивающего HttpServletRequest). В настоящее время я могу решить только не используя Spring инъекцию для ObjectMapper, явно создавая экземпляр ObjectMapper в моем контроллере, выполняя его и возвращая вывод. Итак:

Можно ли получить заголовок Accept-language в экземпляре ObjectMapper, внедренном как Spring bean-компонент?

Ответы [ 2 ]

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

Благодаря Марко мне удалось немного настроить его решение, чтобы оно заработало, используя:

 @Bean
 @RequestScope
 public ObjectMapper objectMapper(@Autowired HttpServletRequest request) {
     ...
     module.addSerializer(Result.class, new ResultSerializer(request.getLocale().toLanguageTag()));
     ...
 }
0 голосов
/ 09 апреля 2020

Возможность (не зная точно, что вы пытаетесь настроить): вы можете попробовать сделать свой ResultSerializer request-scoped.

@Bean
@RequestScope
public ResultSerializer resultSerializer() {
    return new ResultSerializer();
}

Затем вы можете просто вставить свой запрос HttpServletRequest в ResultSerializer.

public class ResultSerializer {

    @Autowired
    private HttpServletRequest request;

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