You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot请求体JSON与Model映射异常问题求助

解决Spring Boot中Jackson字段宽松映射的问题

嘿,这个问题我之前也碰到过,Jackson的自动匹配有时候确实会“自作聪明”,明明字段名看起来不一样却完成了映射,咱们一步步来搞定它~

问题根源

Spring Boot默认的Jackson配置可能启用了自动命名转换(比如在驼峰命名和下划线命名之间自动转换),再加上Jackson本身的宽松匹配规则,就会出现你遇到的“字段名不同却被映射”的情况。另外,如果你之前全局配置了SNAKE_CASE命名策略,也会覆盖@JsonProperty注解的效果。

具体解决步骤

1. 启用严格字段名匹配,关闭自动命名转换

首先要让Jackson放弃“智能转换”,严格按照字段名的原样进行匹配。你可以通过配置文件或者自定义ObjectMapper来实现:

方法一:通过配置文件设置

application.properties中添加:

# 使用严格的驼峰命名匹配,不做自动转换
spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE
# 关闭大小写不敏感匹配(比如避免"Something"和"something"被识别为同一个字段)
spring.jackson.mapper.accept-case-insensitive-properties=false

如果用application.yml的话:

spring:
  jackson:
    property-naming-strategy: LOWER_CAMEL_CASE
    mapper:
      accept-case-insensitive-properties: false

方法二:自定义ObjectMapper(更灵活)

创建一个配置类,手动配置Jackson的映射规则:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 启用严格的字段名匹配,不进行任何自动命名转换
        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        // 关闭大小写不敏感匹配
        objectMapper.disable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
        return objectMapper;
    }
}

2. 开启未知字段报错(可选但推荐)

为了彻底避免意外映射,你可以让Jackson在遇到POJO中不存在的JSON字段时直接抛出异常,这样能快速发现不符合预期的请求:

spring.jackson.deserialization.fail-on-unknown-properties=true

或者在自定义ObjectMapper中添加:

objectMapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

3. 正确使用@JsonProperty注解

如果你需要某个POJO字段对应特定的JSON键,确保@JsonProperty的value是JSON里的准确字段名。比如你想要只有JSON字段为something_1时才映射到POJO的something_1,可以这样写:

public class TempClass { 
    @JsonProperty("something_1")
    private String something_1; 
    @JsonProperty("intgervalue_1")
    private int intgervalue_1; 
    // Getter和Setter方法
}

之前你加注解没效果,大概率是全局的命名策略覆盖了注解设置,先完成上面的严格配置,注解就能正常生效了。

效果验证

完成配置后,当你传入{"something":"54545", "intgervalue":"1212"}时:

  • POJO的something_1intgervalue_1会保持默认值(或者如果开启了FAIL_ON_UNKNOWN_PROPERTIES,会直接抛出异常)
  • 只有当JSON字段名和POJO字段名完全一致时(比如{"something_1":"54545", "intgervalue_1":"1212"}),才会完成正确映射。

内容的提问来源于stack exchange,提问作者NANDAKUMAR THANGAVELU

火山引擎 最新活动