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下。
二、排查配置被覆盖的情况
- 检查项目中是否存在其他自定义的
ObjectMapperBean,这类Bean可能会覆盖Spring Boot自动配置的实例,导致你的配置不生效。建议统一用Jackson2ObjectMapperBuilderCustomizer修改配置,而非直接创建ObjectMapperBean。 - 检查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
相关产品推荐
相关产品推荐

