如何修改Spring Validator代码实现表单提交时一次性展示所有校验错误
代码修改方案
问题根源
你当前的校验逻辑每触发一条校验失败就会执行return直接终止整个校验方法,因此只会收集到第一条匹配的错误信息,最终只能逐条提示。
具体修改点
- 移除所有
if校验块末尾的return语句,让所有校验逻辑都能执行完成,所有符合条件的错误都会被存入Errors对象 - 修正错误的字段名拼写:你现在给用户名添加错误时写的字段名是
userrName(多了一个r),需要改为和实体类属性一致的userName,否则前端无法正确绑定对应字段的错误提示 - 可选优化:添加空指针防护,避免
user.getUserName()为null时抛出空指针异常
修改后的完整代码
@Component public class UserValidation implements Validator { @Override public boolean supports(Class<?> clazz) { return User.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User) target; final String nameRegex = "[A-Za-z]+(\\s[A-Za-z]+)*"; final String phoneRegex = "^[6-9]\\d{9}$"; // 用户名校验 if (user.getUserName() == null || user.getUserName().trim().equals("")) { errors.rejectValue("userName", "userName.required", "Error: User Name is required"); } else { if (user.getUserName().length() > 20) { errors.rejectValue("userName", "userName.lengthLimit", "Error: User Name reached maximum limit of characters allowed"); } if (!user.getUserName().matches(nameRegex)) { errors.rejectValue("userName", "userName.invalid", "Error: Invalid User Name "); } } // 用户类型校验 if ("0".equals(user.getUserType())) { errors.rejectValue("userType", "userType.required", "Error: Select User Type"); } // 用户手机号校验 if (user.getUserNumber() == null || user.getUserNumber().trim().equals("")) { errors.rejectValue("userNumber", "userNumber.required", "Error: User Number is required"); } else if (!user.getUserNumber().matches(phoneRegex)) { errors.rejectValue("userNumber", "userNumber.invalid", "Error: Invalid User Number "); } } }
补充说明
修改完成后,你在调用校验逻辑的位置直接从Errors对象中获取所有错误即可,比如调用errors.getAllErrors()可以拿到全部错误信息,统一返回给前端就能一次性展示所有提示。
内容的提问来源于stack exchange,提问作者lakshman Kommula
相关产品推荐
相关产品推荐

