如何使用 Spring application.properties 自定义 Jackson ObjectMapper?
Posted
技术标签:
【中文标题】如何使用 Spring application.properties 自定义 Jackson ObjectMapper?【英文标题】:How to customize Jackson ObjectMapper with Spring application.properties? 【发布时间】:2017-11-07 07:46:30 【问题描述】:我想启用以下杰克逊映射器功能:
MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES
根据https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html:
可以在application.properties
中配置如下:
spring.jackson.mapper.accept_case_insensitive_properties=true
但是:
@RestController
public class MyServlet
@RequestMapping("/test")
public void test(@Valid TestReq req)
public class TestReq
@NotBlank
private String name;
用法:
localhost:8080/test?name=test //works
localhost:8080/test?Name=test //fails with 'name may not be blank'
因此,不考虑不区分大小写的属性。但为什么呢?
顺便说一句:即使使用Jackson2ObjectMapperBuilderCustomizer
显式也不起作用:
@Bean
public Jackson2ObjectMapperBuilderCustomizer initJackson()
Jackson2ObjectMapperBuilderCustomizer c = new Jackson2ObjectMapperBuilderCustomizer()
@Override
public void customize(Jackson2ObjectMapperBuilder builder)
builder.featuresToEnable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
;
return c;
spring-boot-1.5.3.RELEASE
【问题讨论】:
您在哪里创建 ObjectMapper 实例,在 java 类文件中还是在 spring 配置中? 它是由spring-boot
或spring-mvc
自动创建的,因此在初始化时应该使用配置属性。
我认为您需要更改标签以添加 spring-boot
您正在尝试的是数据绑定,它对杰克逊没有任何作用。您正在传递 URL 参数,而 Jackson 序列化程序/映射器仅对响应主体而不是参数有效。
我可以在1.5.3.RELEASE
版本上进行复制。
【参考方案1】:
根据spring doc可以自定义。
我通过设置我的 application.yml 来解决这个问题(spring 2.0):
spring:
jackson:
mapper:
ACCEPT_CASE_INSENSITIVE_PROPERTIES: true
您是否尝试将您的设置accept_case_insensitive_properties
更改为大写?
您还可以通过如下设置将输出保持为大写:
jackson:
mapper:
ACCEPT_CASE_INSENSITIVE_PROPERTIES: true
property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategy.PascalCaseStrategy
请注意,PascalCaseStrategy 现在已被弃用,但仍然有效。
【讨论】:
当前版本的 spring/spring-boot 使用spring.jackson.mapper.accept-case-insensitive-properties=true
(连字符不是下划线的属性名称;不确定是否区分大小写)。【参考方案2】:
简单的回答:不可能。
Jackson2ObjectMapperBuilderCustomizer
仅影响 JSON POST 请求。它对 get 查询绑定没有影响。
【讨论】:
以上是关于如何使用 Spring application.properties 自定义 Jackson ObjectMapper?的主要内容,如果未能解决你的问题,请参考以下文章