JSR303完成validate校验并编写BeanValidator工具类
一、引入pom依赖
<!-- validator --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
二、针对需要验证的字段封装为TestVo
@Data public class TestVo { @NotNull private Integer id ; @NotBlank private String name; }
三、工具类BeanValidator编写

1 public class BeanValidator { 2 3 private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); 4 5 /** 6 * 校验对象 7 * @param t 对象的泛型 8 * @param groups 9 * @param <T> 10 * @return 11 */ 12 public static <T>Map<String,String> validate(T t,Class... groups){ 13 Validator validator = validatorFactory.getValidator(); 14 Set validateResult = validator.validate(t, groups); 15 if(validateResult.isEmpty()){ 16 return Collections.emptyMap(); 17 }else { 18 LinkedHashMap errors = Maps.newLinkedHashMap(); 19 Iterator iterator = validateResult.iterator(); 20 while (iterator.hasNext()){ 21 ConstraintViolation violation = (ConstraintViolation) iterator.next(); 22 errors.put(violation.getPropertyPath().toString(),violation.getMessage()); 23 } 24 return errors; 25 } 26 } 27 28 /** 29 * 校验集合 30 * @param collection 集合 31 * @return 32 */ 33 public static Map<String,String> validateList(Collection<?> collection){ 34 Preconditions.checkNotNull(collection); 35 Iterator iterator = collection.iterator(); 36 Map errors; 37 do{ 38 if (!iterator.hasNext()) { 39 return Collections.emptyMap(); 40 } 41 Object object = iterator.next(); 42 errors = validate(object,new Class[0]); 43 }while (errors.isEmpty()); // 如果errors为空则循环校验,一旦不为空 跳出循环 44 return errors; 45 } 46 47 /** 48 * 通用方法,至少传入一个Object参数 49 * <p>校验参数之后不会处理只会将错误信息存储到map中 50 * @param first 51 * @param objects 52 */ 53 public static Map<String,String> validateObject(Object first,Object... objects){ 54 if(objects == null || objects.length == 0){ 55 return validate(first,new Class[0]); 56 }else { 57 return validateList(Lists.asList(first,objects)); 58 } 59 } 60 61 /** 62 * 校验参数是否合法 63 * <p>当校验参数不合法时抛出异常让程序不能继续执行 64 * @param param 65 * @throws ParamException 66 */ 67 public static void check(Object param)throws ParamException{ 68 Map<String, String> map = validateObject(param); 69 if(MapUtils.isNotEmpty(map)){ 70 throw new ParamException(map.toString()); 71 } 72 } 73 }
四、Controller类中调用并测试
@Controller @Slf4j @RequestMapping("/test") public class TestController { @RequestMapping("/testVo.json") @ResponseBody public String testVo(TestVo testVo)throws ParamException{ log.info("testVo"); Map<String, String> map = BeanValidator.validateObject(testVo); if(MapUtils.isNotEmpty(map)){ for(Map.Entry<String,String> entry :map.entrySet()){ log.error("error==={}-->{}",entry.getKey(),entry.getValue()); } } //BeanValidator.check(testVo); return "hello world"; } }
运行就会输出这样的日志信息:
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话