Spring Boot中JSON数据类型未校验问题求助
解决字符串字段传入数字时未触发校验错误的问题
这个问题的核心原因是Jackson的自动类型转换机制:默认情况下,Jackson会将JSON中的数字自动转换为字符串类型。当你传入"firstName": 123时,Jackson会把整数123转成字符串"123",此时@Length(min=0, max=50)的校验条件完全满足,所以不会抛出任何校验错误。
下面提供两种可行的解决方案,你可以根据需求选择:
方案一:全局禁用Jackson的数字转字符串特性
通过配置Jackson的ObjectMapper,强制禁止将数字类型转换为字符串类型,这样当请求中传入数字给字符串字段时,Jackson会直接抛出解析异常,Spring会自动返回400 Bad Request错误。
创建一个Jackson配置类:
@Configuration public class JacksonDeserializationConfig { @Bean public ObjectMapper customObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 开启该特性:当尝试将数字解析为字符串时抛出异常 objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_STRINGS, true); return objectMapper; } }
方案二:为单个字段添加自定义类型校验注解
如果你不想全局修改Jackson的行为,可以针对特定字段添加自定义校验,判断转换后的字符串是否为纯数字(也就是由Jackson从数字转换而来的情况),从而触发校验错误。
步骤1:定义自定义校验注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = StringOnlyValidator.class) public @interface StringOnly { String message() default "该字段必须为字符串类型,不能传入数字"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
步骤2:实现校验器逻辑
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class StringOnlyValidator implements ConstraintValidator<StringOnly, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 允许null值(配合@Length的min=0规则) if (value == null) { return true; } // 判断字符串是否为纯数字,如果是则校验不通过 try { Double.parseDouble(value); return false; } catch (NumberFormatException e) { return true; } } }
步骤3:在字段上添加注解
修改Name类的firstName字段:
@StringOnly @Length(min = 0, max = 50) private String firstName;
这样当请求传入数字时,Jackson转换后的纯数字字符串会被@StringOnly校验拦截,抛出你定义的错误信息。
内容的提问来源于stack exchange,提问作者Simbu
相关产品推荐
相关产品推荐

