【问题标题】:Hot to make jackson to use snake_case / camelCase on demand in a Spring Boot REST API?热到让杰克逊在 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 之前定义——这意味着这些设置不能在每个请求的基础上即时更改。我>

标签: java json rest spring-boot jackson


【解决方案1】:

好问题,我建议看看content negotiationhttp 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);
}
...

【讨论】:

    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2012-05-18
    • 2020-02-10
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多