【发布时间】: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