热门让jackson在Spring Boot REST API中按需使用snake_case / camelCase?

时间:2017-03-28 21:03:30

标签: java json rest spring-boot jackson

我想在我的其余API的json界面中同时支持snake_case和camelCase。

杰克逊默认使用camelCase。我知道有很多方法让杰克逊使用snake_case:

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

使用以下代码注释:@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

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

但我没有找到有关如何允许消费者请求所需案例的信息。例如,通过使用内容协商(接受,内容类型标头)

假设我们有以下示例:

@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。

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

1 个答案:

答案 0 :(得分:1)

好问题,我建议您查看content negotiationhttp message converter主题。

您似乎可以配置MappingJackson2HttpMessageConverter的两个实例 生成 application / vnd.snake + json application / 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);
}
...