如何使用 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-bootspring-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?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot入门——邮件发送

springboot初学---使用redis

mysql 多个字段合并

Spring认证指南:了解如何使用 Spring 执行表单验证

请简述啥是CSS3 Spring?如何使用Spring

spring中如何使用策略模式