Springboot结合@validated优化代码验证

目录

创建项目

添加注解

数据验证失败处理

创建项目

创建spring-boot项目,这里我网络不好,就创建普通maven项目,通过依赖手动完成spring-boot项目创建。

添加注解 <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.7.2</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <!-- 数据验证的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> </dependencies>

常用注解说明

@AssertFalse 校验false

@AssertTrue 校验true

@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,是小于等于

@DecimalMin(value=,inclusive=) 与上类似

@Max(value=) 小于等于value

@Min(value=) 大于等于value

@NotNull 检查Null

@Past 检查日期

@Pattern(regex=,flag=) 正则

@Size(min=, max=) 字符串,集合,map限制大小

@Validate 对po实体类进行校验

创建实体类

package com.hopeful.pojo; import lombok.Data; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; @Data public class User implements Serializable { private Integer id; @NotNull(message = "姓名不能为空") private String name; @NotNull @Size(min = 6,message = "密码不能没空,且不能少于6位") private String pwd; }

创建controller

package com.hopeful; import com.hopeful.pojo.User; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @RequestMapping("/user") @RestController public class controller { @RequestMapping("/hello") public String hello() { return "hello"; } @PostMapping("/insertUser") public String insert2(@Validated @RequestBody User user) { System.out.println(user); return "新增成功"; } }

数据验证失败,会报错,需要处理

数据验证失败处理

方法一:controller处理

package com.hopeful; import com.hopeful.pojo.User; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @RequestMapping("/user") @RestController public class controller { @RequestMapping("/hello") public String hello() { return "hello"; } @GetMapping("/insertUser") public User insert(@Validated User user) { return user; } @PostMapping("/insertUser") public String insert2(@Validated @RequestBody User user, BindingResult bindingResult) { if(bindingResult.hasErrors()) { String msg = ""; msg = getString(bindingResult, msg); return msg; } System.out.println(user); return "新增成功"; } public static String getString(BindingResult bindingResult, String msg) { List<FieldError> fieldErrors = bindingResult.getFieldErrors(); int size = fieldErrors.size(); for (int i = 0; i < size; i++) { FieldError fieldError = fieldErrors.get(i); if(fieldError != null) { msg += fieldError.getDefaultMessage(); } if(i < size - 1) { msg += ";"; } } return msg; } }

方法二:全局异常处理

我们建议使用全局异常处理。

创建全局异常处理

package com.hopeful.pojo.common; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.ConstraintViolationException; import javax.validation.ValidationException; import java.util.HashMap; import java.util.List; import java.util.Map; @ControllerAdvice @ResponseBody public class globalException extends RuntimeException { @ExceptionHandler(value = {BindException.class, ValidationException.class,MethodArgumentNotValidException.class}) public String MethodArgumentNotValidException(Exception e) { String msg = ""; if (e instanceof MethodArgumentNotValidException) { BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult(); // getFieldError获取的是第一个不合法的参数(P.S.如果有多个参数不合法的话) //FieldError fieldError = bindingResult.getFieldError(); //if (fieldError != null) { // msg = fieldError.getDefaultMessage(); //} List<FieldError> fieldErrors = bindingResult.getFieldErrors(); int size = fieldErrors.size(); for (int i = 0; i < size; i++) { FieldError fieldError = fieldErrors.get(i); if(fieldError != null) { msg += fieldError.getDefaultMessage(); } if(i < size - 1) { msg += ";"; } } } else if (e instanceof BindException) { // getFieldError获取的是第一个不合法的参数(P.S.如果有多个参数不合法的话) FieldError fieldError = ((BindException) e).getFieldError(); if (fieldError != null) { msg = fieldError.getDefaultMessage(); } } else if (e instanceof ConstraintViolationException) { /* * ConstraintViolationException的e.getMessage()形如 * {方法名}.{参数名}: {message} * 这里只需要取后面的message即可 */ msg = e.getMessage(); if (msg != null) { int lastIndex = msg.lastIndexOf(':'); if (lastIndex >= 0) { msg = msg.substring(lastIndex + 1).trim(); } } /// ValidationException 的其它子类异常 } else { msg = "处理参数时异常"; } return msg; } }

##测试

结果如下:

到此这篇关于Springboot结合@validated优化代码验证的文章就介绍到这了,更多相关Springboot @validated内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    SpringBoot自动配置的实现原理是什么

    SpringBoot自动配置的实现原理是什么,配置,组件,文件,方法,注册,获取,一、什么是springboot自动配置SpringBoot通过@EnableAutoConfiguration注

    SpringBoot启动流程是什么

    SpringBoot启动流程是什么,应用程序,方法,组件,上下文,对象,配置,SpringBoot启动过程简介SpringBoot应用程序的启动过程可以分为以下几个步骤:加

    SpringBoot之整合Shiro

    SpringBoot之整合Shiro,SpringBoot,之,整合,Shiro,1.SpringBoot,整合,Shiro,,1.SpringBoot整合Shiro思路2. 环境搭建2.1 创建项目2.2 引入

    SpringBoot与SpringCache

    SpringBoot与SpringCache,SpringBoot,与,SpringCache,1.SpringCache,的,概念,首先,,1.SpringCache的概念首先我们知道jpa,jdbc这些东西都

    SpringBoot集成kafka全面实战

    SpringBoot集成kafka全面实战,SpringBoot,集成,kafka,全面,实战,一,、,前戏,在,,一、前戏1、在项目中连接kafka,因为是外网,首先要开放kafka

    SpringBoot集成Elasticseach

    SpringBoot集成Elasticseach,SpringBoot,集成,Elasticseach,一,、,Elasticseach,介绍,,  一、Elasticseach介绍  1.简单介绍  官网:

    SpringBoot2.x 集成 Dozer

    SpringBoot2.x 集成 Dozer,SpringBoot2.x,集成,Dozer,一,、,引入,依赖,dependency,,一、引入依赖<dependency> <groupId>com.github.doze