数据校验

  • 前言
  • 正文
    • 单个对象
    • 一组对象
  • 结束

前言

大多数项目中都需要后台对传过来的对象进行校验,比如手机号的位数,特殊字段不能为空等等。之前我们可能都是使用if…else…,今天我们了解一下validated

正文

单个对象

想要使用validated需要引入Jar包,有两个方式,选择一种即可:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.1.5.Final</version>
</dependency>

对于单个对象我们可以直接使用注解,在方法中使用案例:

  /*** 修改方法* @param students 学生类(需要校验的对象)* @param result 检验返回的结果信息* @return*/@PutMapping()public String updateStudent(@RequestBody @Validated Student students, BindingResult result){/*** 查看校验结果,统计保存信息*/Set<String> errors = new HashSet<>();// 如果 BindingResult 的 hasErrors 方法返回true,则表示有错误信息if (result.hasErrors()) {List<ObjectError> allErrors = result.getAllErrors();// 遍历错误信息,返回给前端for (ObjectError error : allErrors) {errors.add(error.getDefaultMessage());}}if(errors.size() == 0){try {studentService.updateByPrimaryKeySelective(students);return "更新成功";} catch (Exception e) {e.printStackTrace();return "更新失败";}}else {return errors.toString();}}

实体中写上校验规则,基本的校验规则都有,大家可以自行Google一下,这里就不介绍了

    @NotEmpty(message = "ID不能为空")private Integer id;@Size(min = 5,max = 10,message = "名称需要在5到10个字符之间")private String name;

然后通过postman验证数据,可以跑出来我们想要的结果:

一组对象

我直接在接收参数把Student装到了List中,结果发现没有校验直接过了,看来这个方式不对。

public String updateStudent(@RequestBody @Validated List<Student> students, BindingResult result)

然后Google了一下,有文章说在Controller添加@Validated,在方法上添加@Valid,然后我运行发现报错,但是报错的内容里有我想要的信息,我就想到定义一个全局抛错类,抓住javax.validation.ConstraintViolationException 错误,把错误解析,拿出想要的信息,结果发现这个报错抓不住,这个方式也没走通。

@Validated
@CrossOrigin
@RestController
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** 修改方法* @param students 学生类(需要校验的对象)* @param result 检验返回的结果信息* @return*/@PutMapping()public String updateStudent(@RequestBody @Valid List<Student> students, BindingResult result){/*** 查看校验结果,统计保存信息*/Set<String> errors = new HashSet<>();// 如果 BindingResult 的 hasErrors 方法返回true,则表示有错误信息if (result.hasErrors()) {List<ObjectError> allErrors = result.getAllErrors();// 遍历错误信息,返回给前端for (ObjectError error : allErrors) {errors.add(error.getDefaultMessage());}}if(errors.size() == 0){try {studentService.updateByPrimaryKeySelective(students.get(0));return "更新成功";} catch (Exception e) {e.printStackTrace();return "更新失败";}}else {return errors.toString();}}
}


再一次进行Google,查看了一下@Validated和@Valid的区别,发现@Validated用在方法入参上无法单独提供嵌套验证功能,但是单个对象是可以的,那我可以把List继承一下,写成一个对象。然后再调用的时候,还是和单个对象一样。这次得到了想要的结果,由于报错信息可能重复的太多,所以用Set接收的错误信息。

public class ValidList<E> implements List<E> {@Validprivate List<E> list = new LinkedList<>();@Overridepublic int size() {return list.size();}@Overridepublic boolean isEmpty() {return list.isEmpty();}@Overridepublic boolean contains(Object o) {return list.contains(o);}@Overridepublic Iterator<E> iterator() {return list.iterator();}@Overridepublic Object[] toArray() {return list.toArray();}@Overridepublic <T> T[] toArray(T[] a) {return list.toArray(a);}@Overridepublic boolean add(E e) {return list.add(e);}@Overridepublic boolean remove(Object o) {return list.remove(o);}@Overridepublic boolean containsAll(Collection<?> c) {return list.containsAll(c);}@Overridepublic boolean addAll(Collection<? extends E> c) {return list.addAll(c);}@Overridepublic boolean addAll(int index, Collection<? extends E> c) {return list.addAll(index, c);}@Overridepublic boolean removeAll(Collection<?> c) {return list.removeAll(c);}@Overridepublic boolean retainAll(Collection<?> c) {return list.retainAll(c);}@Overridepublic void clear() {list.clear();}@Overridepublic E get(int index) {return list.get(index);}@Overridepublic E set(int index, E element) {return list.set(index, element);}@Overridepublic void add(int index, E element) {list.add(index, element);}@Overridepublic E remove(int index) {return list.remove(index);}@Overridepublic int indexOf(Object o) {return list.indexOf(o);}@Overridepublic int lastIndexOf(Object o) {return list.lastIndexOf(o);}@Overridepublic ListIterator<E> listIterator() {return list.listIterator();}@Overridepublic ListIterator<E> listIterator(int index) {return list.listIterator(index);}@Overridepublic List<E> subList(int fromIndex, int toIndex) {return list.subList(fromIndex, toIndex);}public List<E> getList() {return list;}public void setList(List<E> list) {this.list = list;}}
@CrossOrigin
@RestController
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** 修改方法* @param students 学生类(需要校验的对象)* @param result 检验返回的结果信息* @return*/@PutMapping()public String updateStudent(@RequestBody @Validated ValidList<Student> students, BindingResult result){/*** 查看校验结果,统计保存信息*/Set<String> errors = new HashSet<>();// 如果 BindingResult 的 hasErrors 方法返回true,则表示有错误信息if (result.hasErrors()) {List<ObjectError> allErrors = result.getAllErrors();// 遍历错误信息,返回给前端for (ObjectError error : allErrors) {errors.add(error.getDefaultMessage());}}if(errors.size() == 0){try {studentService.updateByPrimaryKeySelective(students.get(0));return "更新成功";} catch (Exception e) {e.printStackTrace();return "更新失败";}}else {return errors.toString();}}
}

结束

感觉写代码就是一步一步的尝试,错了就换一种是方式。
抓住自己有兴趣的东西,由浅入深,循序渐进地学。

数据校验@Validated(解决javax.validation.ConstraintViolationException问题)相关推荐

  1. 【VS常量类和 else if】更完美的数据校验,解决码值乱送问题的思路

     01 假如现在有一个接口,别人调用送过来的请求报文中有个字段叫 vipType,对服务方来说,假设这个数据只有3种类型:1-穷逼VIP ,2-普通VIP,3-尊贵VIP. 那么问题来了,这个对应的关 ...

  2. Validated数据校验,看这一篇就够了

    目录 1 介绍 1.1 什么是数据校验 1.2 Java提供的数据校验工具 1.3 @Validated和@Valid的区别 1.4 依赖导入 1.5 常用数据校验注解 2 使用 2.1 校验实体类 ...

  3. springboot validated注解数据校验 异常处理

    springboot validated 数据校验 validated 数据校验 简单的写一下这个用法啊,清晰的本篇文章就记录这个注解的一个用法. validated 数据校验 我们一般的数据校验是怎 ...

  4. SpringBoot——服务端数据校验

    Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 一.添加依赖: 添加依赖的时候注意不要添 ...

  5. @valid 校验_SpringBoot数据校验与优雅处理详解

    本篇要点 JDK1.8.SpringBoot2.3.4release 说明后端参数校验的必要性. 介绍如何使用validator进行参数校验. 介绍@Valid和@Validated的区别. 介绍如何 ...

  6. javax.validation

    概述 使用场景 通常在遇到大量的参数进行校验时,业务中还要抛出异常或者不断的返回异常的校验信息:在代码中相对冗长,充满了if-else这种校验代码,相当痛苦. 为什么选择validator javax ...

  7. SpringBoot后端数据校验实战

    本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot后端数据校验实战 一般我们会在Controller的接口中对前端传递的参数做数据校验,这是一个后端开发人员的基本素养 在Sp ...

  8. 数据校验JSR303快速入门(简单使用、分组效验、自定义注解效验)

    前言: 在实际开发中,除了前端需要在表单中验证用户的输入.后台服务也需要对用户传入的参数进行效验,避免他人在得知请求格式后,直接通过类似Postman这样的测试工具进行非常数据请求. JSR303是什 ...

  9. @Value获取值和@ConfigurationProperties获取值比较||配置文件注入值数据校验

    @Value获取值和@ConfigurationProperties获取值比较 配置文件yml还是properties他们都能获取到值: 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值 ...

最新文章

  1. vim的高级用法配置以及在系统中如何获取帮助
  2. DOM性能瓶颈与Javascript性能优化
  3. 2019ICPC(上海) - Counting Sequences I(dfs打表)
  4. html的meta属性
  5. 牛客网 在线编程 折纸问题
  6. 关于npm邮箱验证问题
  7. 数据分析常用的python包_量化投资数据分析之常用的python包(附代码)
  8. 混淆矩阵(TP+FN+FP+TN)
  9. [转贴]什么计算机语言最有前途
  10. SQL常用脚本大全,建议收藏!
  11. nginx 下配置禅道
  12. SLA、BFD、NQA、ACl 笔记
  13. PHP公历农历转换(阴历阳历转换)阴历和阳历转换
  14. [CGAL]建立一个正四面体
  15. 记录一下我的phpcms下载模板的下载列表页面不能够显示出列表页面
  16. 阿里云服务器ECS和VPS主机的区别在哪里
  17. 单片机c语言的按键程序设计,单片机C语言程序设计:按键发音
  18. 大数据学习笔记:聚类分析
  19. 如何扩大图片尺寸大小?图片怎么编辑大小尺寸?
  20. CAD批量导入点的方法

热门文章

  1. 使用matlab设计电机控制器,基于Matlab平台的球形电机控制器设计
  2. windows如何软件获取主板序列号等信息
  3. OpenWrt系统配置UCI
  4. include、extends用法和区别
  5. 年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中
  6. 车牌分割python_OpencvPython实现车牌字符分割
  7. Android开发基础:利用 Android Studio开发看美女应用(4)
  8. 解决请求数据量过大,分批多次请求的问题
  9. 使用Process Explorer查看程序加载的dll
  10. 浅谈用Excel开发MIS的方法