热到让杰克逊在 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+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);
...
【讨论】:
以上是关于热到让杰克逊在 Spring Boot REST API 中按需使用蛇案例/骆驼案例?的主要内容,如果未能解决你的问题,请参考以下文章
设置杰克逊功能 WRITE_DATES_AS_TIMESTAMPS 在 Spring Boot 中不起作用
杰克逊自定义反序列化器在 Spring Boot 中不起作用
如何在 JUnitTests 中使用 ObjectMapper - Spring Boot 应用程序