如何阻止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
相关产品推荐
相关产品推荐

