【问题标题】:How to customize Jackson ObjectMapper with Spring application.properties?如何使用 Spring application.properties 自定义 Jackson ObjectMapper?
【发布时间】: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 版本上进行复制。

标签: java json spring-mvc spring-boot jackson


【解决方案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 查询绑定没有影响。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2015-07-15
    • 2019-03-15
    • 2014-02-23
    相关资源
    最近更新 更多