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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:28:15