我想在我的其余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配置的方法。
答案 0 :(得分: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);
}
...