【问题标题】:How to make injected objectmapper output locale-specific如何使注入的objectmapper输出特定于语言环境
【发布时间】:2020-07-21 17:33:15
【问题描述】:

我有一个带有该方法的 Spring Boot REST 控制器

  @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)自定义序列化输出。我目前只能通过不对ObjectMapper 使用 Spring 注入来解决,在我的控制器中显式创建一个 ObjectMapper 实例,执行它并返回输出。所以:

可以在ObjectMapper实例中获取Accept-language标头作为Spring bean注入吗?

【问题讨论】:

  • 您具体想定制什么?
  • 我正在尝试根据请求中的参数(在本例中为 Accept-Language 标头)更改 ObjectMapper 的行为。我的问题是 ObjectMapper 示例不是请求范围的,所以我不确定如何将传入的 HTTP 请求标头作为参数传递给它们。
  • 具体想改变什么行为?这不是最佳做法。

标签: java spring spring-boot jackson


【解决方案1】:

一种可能性(不确切知道您要自定义什么):您可以尝试将 ResultSerializer 设为 request-scoped

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

然后您可以简单地将您的 HttpServletRequest 注入 ResultSerializer。

public class ResultSerializer {

    @Autowired
    private HttpServletRequest request;

}

【讨论】:

    【解决方案2】:

    感谢 Marco,我设法稍微调整了他的解决方案以使其正常工作:

     @Bean
     @RequestScope
     public ObjectMapper objectMapper(@Autowired HttpServletRequest request) {
         ...
         module.addSerializer(Result.class, new ResultSerializer(request.getLocale().toLanguageTag()));
         ...
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多