You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中POST请求Int自动转String问题及配置无效求助

解决Jackson自动将Int转为String导致字段类型验证失效的问题

一、检查Jackson全局配置的正确性

1. 使用Jackson2ObjectMapperBuilderCustomizer配置(推荐)

Spring Boot中更建议用Jackson2ObjectMapperBuilderCustomizer定制Jackson配置,它会和自动配置兼容,避免覆盖默认配置。创建配置类:

@Configuration
public class JacksonConfig {
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCoercionCustomizer() {
        return builder -> {
            // 禁用标量类型之间的强制转换
            builder.featuresToDisable(DeserializationFeature.ALLOW_COERCION_OF_SCALARS);
        };
    }
}

2. 确认application.yml配置格式

如果用配置文件,确保yaml的缩进和属性名正确:

spring:
  jackson:
    deserialization:
      allow_coercion_of_scalars: false

注意:yaml对缩进敏感,deserialization需缩进在jackson下,allow_coercion_of_scalars需缩进在deserialization下。

二、排查配置被覆盖的情况

  • 检查项目中是否存在其他自定义的ObjectMapper Bean,这类Bean可能会覆盖Spring Boot自动配置的实例,导致你的配置不生效。建议统一用Jackson2ObjectMapperBuilderCustomizer修改配置,而非直接创建ObjectMapper Bean。
  • 检查Controller层是否使用了自定义的@RequestBody解析器,或引入了Gson等其他JSON处理框架,这些都会干扰Jackson的默认行为。

三、字段级别的严格验证(兜底方案)

如果全局配置仍不生效,可在实体类的目标字段上添加自定义反序列化器,强制校验类型:

1. 编写严格的字符串反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;

public class StrictStringDeserializer extends StdDeserializer<String> {
    public StrictStringDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        if (parser.getCurrentToken() != JsonToken.VALUE_STRING) {
            throw context.wrongTokenException(parser, JsonToken.VALUE_STRING, 
                "字段类型错误,预期String类型,实际为" + parser.getCurrentToken().name());
        }
        return parser.getText();
    }
}

2. 在实体类字段上应用反序列化器

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class Patient {
    private String name;
    
    @JsonDeserialize(using = StrictStringDeserializer.class)
    private String surname;
    
    private String sickness;
    
    // getter、setter省略
}

四、测试注意事项

发送请求时确保:

  • 请求头Content-Type设置为application/json
  • 请求体中surname的值是数字类型(比如43),而非字符串类型(比如"43")

内容的提问来源于stack exchange,提问作者Bibily Bob Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:01:01