Spring Validation搭配Jakarta @AssertTrue返回冗余长消息,如何获取指定提示?
直接获取Jakarta校验提示消息的方法
以下是几种无需解析冗长异常信息,直接获取目标提示的方案:
1. 从校验结果的ConstraintViolation中提取
如果你是通过Validator的validate()方法执行校验,直接从返回的ConstraintViolation集合中获取消息即可,这是最直接的方式:
import jakarta.validation.Validation; import jakarta.validation.Validator; import java.util.Set; import jakarta.validation.ConstraintViolation; // 初始化Validator Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); // 执行校验 Set<ConstraintViolation<YourEntity>> violations = validator.validate(yourEntityInstance); // 遍历获取干净提示 for (ConstraintViolation<YourEntity> violation : violations) { String targetMessage = violation.getMessage(); // 直接拿到"Incorrect phone number" }
2. 利用MessageInterpolator解析国际化消息键
你的注解中使用了{validation.phone.incorrect}这种国际化键,可以直接通过MessageInterpolator来解析该键,得到最终提示文本:
import jakarta.validation.Validation; import jakarta.validation.MessageInterpolator; import jakarta.validation.ValidatorFactory; ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); MessageInterpolator interpolator = factory.getMessageInterpolator(); // 解析国际化键 String targetMessage = interpolator.interpolate("{validation.phone.incorrect}", null);
3. Spring环境下使用BindingResult提取
如果是在Spring MVC的控制器中,参数校验错误会被封装到BindingResult里,直接从其中的错误对象获取消息:
import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.PostMapping; import jakarta.validation.Valid; @PostMapping("/save") public String saveEntity(@Valid YourEntity entity, BindingResult result) { if (result.hasErrors()) { ObjectError error = result.getAllErrors().get(0); String targetMessage = error.getDefaultMessage(); // 获取目标提示 // 后续处理逻辑 } // 保存逻辑 return "success"; }
说明
你之前遇到的异常信息冗余问题,通常是因为直接打印了异常的toString()或getMessage()(这类信息包含校验上下文,比如约束类、属性名等)。上述方案都是直接从校验结果或国际化组件中获取处理好的目标提示,无需解析冗长文本。
内容的提问来源于stack exchange,提问作者mykola
相关产品推荐
相关产品推荐

