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

如何阻止ConstraintValidator向BindingResult添加默认错误信息?

解决BindingResult出现默认错误信息的问题

要消除针对body字段的默认错误信息,核心是阻止校验器生成默认的约束违反,转而手动绑定错误到指定的body.text字段,具体操作如下:

1. 在自定义校验器中禁用默认约束违反

在SmsTextLengthValidator的isValid方法开头,调用constraintValidatorContext.disableDefaultConstraintViolation(),这会阻止框架自动生成针对注解所在字段(即body)的默认错误。

2. 手动添加针对text字段的自定义错误

校验失败时,通过ConstraintValidatorContext构建约束违反,并指定错误绑定到text属性节点:

@Override
public boolean isValid(SmsMessageDto smsMessageDto, ConstraintValidatorContext context) {
    // 禁用默认约束违反,避免生成body字段的默认错误
    context.disableDefaultConstraintViolation();

    boolean isValid = true;
    // 编写校验逻辑:根据encoding判断text长度是否合规
    if (!checkTextLength(smsMessageDto.getEncoding(), smsMessageDto.getText())) {
        isValid = false;
        // 构建自定义错误,绑定到text字段
        context.buildConstraintViolationWithTemplate("你的自定义错误信息")
               .addPropertyNode("text") // 指定错误归属的属性
               .addConstraintViolation();
    }
    return isValid;
}

3. 调整注解的默认消息(可选)

如果你的@ValidSmsTextLength注解设置了默认message,可以将其改为空字符串或无意义占位符,避免意外触发默认错误:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SmsTextLengthValidator.class)
public @interface ValidSmsTextLength {
    // 将默认消息设为空,或改为不会展示的内容
    String message() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

完成上述操作后,BindingResult中只会保留针对body.text字段的自定义错误信息,不会再出现body字段的默认错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:20:28