在开发工作中,前端对提交的数据交验完后,后台代码也必须做一次校验,否则安全方面得不到保障,但每次都得手动校验非常麻烦,工作量大,重复性强,效率低下。这个时候JSR303可以帮到您!要实现自动校验小编整理了两种方式一,小编推荐方式二。maven依赖
org.springframework.bootgroupId> spring-boot-starter-validationartifactId>dependency>
公共代码User类
/** * @author Wgy * @date 2020/11/25 18:09 * @describe 用户实体类 */@Datapublic class User implements Serializable { private static final long serialVersionUID = -425383051343505767L; @NotBlank(message = "姓名不能为空") private String name; @NotBlank(message = "邮箱不能为空") @Email(message = "必须为邮箱格式") private String email; @NotNull(message = "必须填写年龄") @Min(value = 0, message = "年龄必须大于等于0") private Integer age;}
方式一:
1.添加依赖
2.在bean的属性上添加校验注解
3.在控制器接收参数的前面紧跟@Valid注解,表示该参数需要校验
4.在控制器需要校验的参数后面紧跟BindingResult类,校验的异常信息会复制到BindingResult对象,根据对象获取检验异常返回信息
/** * &#64;author Wgy * &#64;date 2020/11/26 11:15 * &#64;describe 后台接收&#xff0c;方式一 */ &#64;GetMapping(value &#61; "/getUser1") public Map mode1(&#64;Valid User user, BindingResult result) { Map map &#61; new HashMap<>(); //获取错误信息 List fieldErrors &#61; result.getFieldErrors(); //遍历错误信息 fieldErrors.forEach(item -> { String field &#61; item.getField(); String defaultMessage &#61; item.getDefaultMessage(); map.put(field, defaultMessage); }); if (fieldErrors.size() <&#61; 0) map.put("data", user); return map; }
返回
方式二&#xff1a;使用全局异常统一处理的方式步骤&#xff1a;
1.添加依赖
2.在bean的属性上添加校验注解
3.在控制器接收参数的前面紧跟&#64;Valid注解&#xff0c;表示该参数需要校验
4.使用全局异常处理方式拦截校验异常&#xff0c;在处理异常的方法上获取校验异常信息返回
首先定义全局异常处理类
/** * &#64;author Wgy * &#64;date 2020/11/25 18:56 * &#64;describe 全局异常类 */&#64;RestControllerAdvice(basePackageClasses &#61; JController.class)public class ExceptionControllerAdvice { &#64;ExceptionHandler(value &#61; BindException.class) public JSONObject handleVaildException(BindException e) { JSONObject json &#61; new JSONObject(); BindingResult result &#61; e.getBindingResult(); result.getFieldErrors().forEach(item -> { String message &#61; item.getDefaultMessage(); String field &#61; item.getField(); json.put(field, message); }); System.out.println("异常"); return json; }}
参数接收
/** * &#64;author Wgy * &#64;date 2020/11/26 11:42 * &#64;describe 方式二 */ &#64;GetMapping(value &#61; "/getUser2") public String mode2(&#64;Valid User user) { return user.toString(); }
返回
主编推荐方式二&#xff0c;一次处理全局使用&#xff0c;让开发人员只注重业务逻辑的开发。
下面是JSR303的注解说明&#xff1a;
空检查
&#64;Null 验证对象是否为null
&#64;NotNull 验证对象是否不为null, 无法查检长度为0的字符串
&#64;NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
&#64;NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
&#64;AssertTrue 验证 Boolean 对象是否为 true
&#64;AssertFalse 验证 Boolean 对象是否为 false
长度检查
&#64;Size(min&#61;, max&#61;) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
&#64;Length(min&#61;, max&#61;) Validates that the annotated string is between min and max included.
日期检查
&#64;Past 验证 Date 和 Calendar 对象是否在当前时间之前&#xff0c;验证成立的话被注释的元素一定是一个过去的日期
&#64;Future 验证 Date 和 Calendar 对象是否在当前时间之后 &#xff0c;验证成立的话被注释的元素一定是一个将来的日期
&#64;Pattern 验证 String 对象是否符合正则表达式的规则&#xff0c;被注释的元素符合制定的正则表达式&#xff0c;regexp:正则表达式 flags: 指定 Pattern.Flag 的数组&#xff0c;表示正则表达式的相关选项。
数值检查
建议使用在Stirng,Integer类型&#xff0c;不建议使用在int类型上&#xff0c;因为表单值为“”时无法转换为int&#xff0c;但可以转换为Stirng为”“,Integer为null
&#64;Min 验证 Number 和 String 对象是否大等于指定的值
&#64;Max 验证 Number 和 String 对象是否小等于指定的值
&#64;DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
&#64;DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
&#64;Digits 验证 Number 和 String 的构成是否合法
&#64;Digits(integer&#61;,fraction&#61;) 验证字符串是否是符合指定格式的数字&#xff0c;interger指定整数精度&#xff0c;fraction指定小数精度。
&#64;Range(min&#61;, max&#61;) 被指定的元素必须在合适的范围内
&#64;Range(min&#61;10000,max&#61;50000,message&#61;”range.bean.wage”)
&#64;Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
&#64;CreditCardNumber信用卡验证
&#64;Email 验证是否是邮件地址&#xff0c;如果为null,不进行验证&#xff0c;算通过验证。
&#64;ScriptAssert(lang&#61; ,script&#61;, alias&#61;)
&#64;URL(protocol&#61;,host&#61;, port&#61;,regexp&#61;, flags&#61;)