热到让杰克逊在 Spring Boot REST API 中按需使用蛇案例/骆驼案例?

Posted

技术标签:

【中文标题】热到让杰克逊在 Spring Boot REST API 中按需使用蛇案例/骆驼案例?【英文标题】:Hot to make jackson to use snake_case / camelCase on demand in a Spring Boot REST API? 【发布时间】:2017-08-22 03:17:37 【问题描述】:

我想在我的rest API的json接口中同时支持snake_case和camelCase。

Jackson 默认使用 camelCase。我知道有很多方法可以让 Jackson 使用 snake_case:

单独注释属性:@JsonProperty("first_name")

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)注释类

将其应用于 application.properties 中的整个应用程序: spring.jackson.property-naming-strategy=SNAKE_CASE

但我还没有找到有关如何让消费者请求所需案例的信息。例如通过使用内容协商(Accepts, Content-Type headers)

假设我们有以下示例:

@RequestMapping("/my-resource") 
public interface ApiController 
    @RequestMapping(method = RequestMethod.POST, produces = "application/json")
    MyResource createResource(@RequestBody MyResource myResource);

    @GetMapping(value="/resourceId", produces = "application/json")
    MyResource readResource(@PathVariable String resourceId);

因此,一个用例可能是使用自定义 json 媒体类型并提供内容协商标头,例如:

Accepts: application/vnd.snake+json

并让默认的application/json 使用camelCase。

但我找不到让杰克逊根据内容协商使用两种不同映射器配置的方法。

【问题讨论】:

想要支持两种格式似乎是一个值得追求的目标,但实际上您将 api 的表面积增加了一倍(以及所需的必要测试)。您将需要创建两个不同的 Mapper(s) 并可能尝试两者。并且(可能)这两种映射都可能有效。从Mapper Features 开始,Jackson 定义了一组每个映射器的配置,只能在使用 ObjectMapper 之前定义——这意味着这些设置不能在每个请求的基础上即时更改。我> 【参考方案1】:

好问题,我建议看看content negotiation 和http message converter 主题。

看来你可以配置MappingJackson2HttpMessageConverter的两个实例 生成 application/vnd.snake+jsonapplication/json。 使用特定的媒体类型和不同配置的 ObjectMapper

设置它

代码修改可以如下所示:

MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter

  public MyMappingJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType mediaType)
  
     super(objectMapper, mediaType);
  

配置如下:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter 

  @Override
  public void configureMessageConverters(
    List<HttpMessageConverter<?>> converters)      
      converters.add(new MyMappingJackson2HttpMessageConverter(snake, new MediaType("application", "vnd.snake+json")));
      converters.add(new MappingJackson2HttpMessageConverter(camel, MediaType.APPLICATION_JSON));
      super.configureMessageConverters(converters);

...

【讨论】:

以上是关于热到让杰克逊在 Spring Boot REST API 中按需使用蛇案例/骆驼案例?的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊与 Spring Boot 基于深度的序列化

设置杰克逊功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用

杰克逊自定义反序列化器在 Spring Boot 中不起作用

如何在 JUnitTests 中使用 ObjectMapper - Spring Boot 应用程序

如何使用jackson映射动态json属性名称以进行spring rest模板请求

Spring boot,Jackson Json 在序列化和反序列化时出现问题