Springboot版本:2.3.1.RELEASE

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

ps:Springboot版本在2.3一下的引用的是别的依赖,可以查一下。

新增用户请求体

package com.study.bean.dto;import com.study.bean.volidate.AgeAdultCompare;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;/*** @Author Curtain* @Date 2021/4/26 15:34* @Description*/
@Data
@ApiModel("新增用户请求体")
@AgeAdultCompare
public class AddPersonParam {/*** 姓名*/@NotBlank(message = "姓名不能为空")@ApiModelProperty(name = "name", value = "姓名", required = true)private String name;/*** 性别*/@NotBlank(message = "性别不能为空")@ApiModelProperty(name = "sex", value = "性别", required = true)private String sex;/*** 年龄*/@NotNull(message = "年龄不能为空")@Min(value = 0, message = "年龄最小为10岁")@Max(value = 1000, message = "人类目前年龄超不过1000岁")@ApiModelProperty(name = "age", value = "年龄", required = true)private Integer age;/*** 0未成年1成年*/@NotNull(message = "是否成年不能为空")@ApiModelProperty(name = "adult", value = "0未成年1成年", required = true)private Integer adult;
}

这里涵盖了validate注解中的@NotNull、@NotBlank、@Min、@Max还有个自定义的validate注解@AgeAdultCompare。

除了自定义的validate注解以外,其他的几个注解想必大家一眼就能看出来是什么意思,这里就不再赘述。

自定义的@AgeAdultCompare注解

作用:用来校验年龄和是否成年这两个字段是否相对应(年龄大于18必须是成年,年龄小于18必须是未成年)

首先是定义一个validate类型的注解

package com.study.bean.volidate;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** @Author Curtain* @Date 2021/4/26 15:40* @Description 自定义注解,校验年龄和是否成年*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Constraint(validatedBy = AgeAdultValidator.class)
public @interface AgeAdultCompare {//校验未通过时的返回信息String message() default "年龄和是否成年要相对应";//以下两行未固定模板Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
}

其中的AgeAdultValidator就是我们要创建的校验类,里面写的是校验逻辑.

AgeAdultValidator

package com.study.bean.volidate;import com.study.bean.dto.AddPersonParam;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;/*** @Author Curtain* @Date 2021/4/26 15:41* @Description*/
public class AgeAdultValidator implements ConstraintValidator<AgeAdultCompare, Object> {@Overridepublic boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {if (o instanceof AddPersonParam){AddPersonParam param = (AddPersonParam) o;if (param.getAge() != null && param.getAdult() != null){if (param.getAge() > 17 && param.getAdult() == 0)return false;if (param.getAge() < 17 && param.getAdult() == 1)return false;}}return true;}}

这些都写完之后,我们要在接口上面的请求参数前加上@valid注解就完事了

package com.study.web.controller;import com.study.bean.dto.AddPersonParam;
import com.study.bean.response.ResultBody;
import com.study.service.api.db01.PersonService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.validation.Valid;/*** @Author Curtain* @Date 2021/4/26 15:49* @Description*/
@RestController
@RequestMapping("/api/v1")
@Api(tags = "人员控制类")
public class PersonController {@Resourceprivate PersonService personService;@PostMapping("/person")@ApiOperation(value = "新增人员", notes = "新增人员")ResultBody addPerson(@RequestBody @Valid AddPersonParam addPersonParam){return ResultBody.success(personService.add(addPersonParam));}
}

测试接口的时候,不符合我们注解的要求都会抛出一个叫做MethodArgumentNotValidException的异常。

如果我们想把我们在validate相关注解中的message信息返回给调用的人,我们可以定义一个全局的异常捕获。

全局异常捕获类

package com.study.web.config;import com.study.bean.enums.ResponseEnum;
import com.study.bean.exception.ApiException;
import com.study.bean.response.ResultBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;@RestControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 捕获全局入参错误异常* @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)public ResultBody handleGlobalException(MethodArgumentNotValidException e){return ResultBody.error(e.getBindingResult().getAllErrors().stream().map(a -> a.getDefaultMessage()).collect(Collectors.joining(",")));}}

这里的ResultBody是我自己写的一个返回实体类。

ResultBody

package com.study.bean.response;import com.study.bean.enums.ResponseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;/*** @Author Curtain* @Date 2021/4/15 20:12* @Description*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ResultBody<T> {/*** 状态码*/private String code;/*** 状态信息*/private String message;/*** 接口返回数据*/private T result;public static ResultBody success(){return success(null);}public static <T> ResultBody<T> success(T o) {ResultBody resultBody = new ResultBody(ResponseEnum.SUCCESS);resultBody.setResult(o);return resultBody;}public static ResultBody error(String code, String message){return new ResultBody(code, message, null);}public static ResultBody error(String message){return new ResultBody("-1", message, null);}
}

可以根据自己的需求删减和补充。

最后附上一个测试结果图

使用validate注解做校验以及自定义validate注解相关推荐

  1. 用自定义注解做点什么——自定义注解有什么用

    用自定义注解做点什么 前言 你不一定听过注解,但你一定对@Override不陌生. 当我们重写父类方法的时候我们就看到了@Override.我们知道它表示父类方法被子类重写了. 现在告诉你,@Over ...

  2. 自定义的注解校验器的实现

    首先先学习一下注解,注解为我们在代码中添加信息提供了一种形式化的方法,使得我们在稍后的某个时刻可以方便地使用这些数据. 在日常的编码中我们一直都在使用注解,只是没有特别关注过,Java中内置了三种注解 ...

  3. 自定义Login注解

    自定义Login注解,实现在controller增加注解登录拦截 1.自定义Login注解 import java.lang.annotation.ElementType; import java.l ...

  4. java 注解方式_小知识~~javaSE注解(超详细)

    第一节 反射应用:完善DBUtil,提取select() 1.1 认识ResultSetMetaData 利用ResultSet的getMetaData的方法可以获得ResultSetMeta对象,而 ...

  5. java validate校验_自定义工具类实现validate参数校验

    前言 相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了 1.通过注解实现各种状态的字段 1.1.引入依赖 默认的版本是6.0.9.Fina ...

  6. hibernate-validate如何校验controller+service+分组校验+自定义注解实现校验规则等

    配置参数启动时校验 如果配置文件没有相关的配置,那么**启动时**就会出现以下异常: Description:Binding to target com.toby.provide.Applicatio ...

  7. Java 校验注解的使用、自定义校验注解

    文章目录 一.引入依赖 二.基本校验 1. 常用校验注解 2. 自动校验 3. 代码中获取校验结果 三.嵌套校验 四.分组校验 五.单属性自定义校验规则 1. 功能:只能取枚举的值 六.多属性自定义联 ...

  8. return error怎么定义_自定义一个注解校验接口参数

    这段时间封装了很多的sdk,有一些sdk要求请求参数做验证,由于封装sdk肯定是用到第三方的依赖越少越好,所以自己不才写了一个注解的校验,本版本校验没有给出自定一点message,如果要可以自己加上, ...

  9. element form自定义校验_SpringBoot分组校验及自定义校验注解

    前言   在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性.在此之前写过一篇SpringBoot统一参数校验主要介绍了一些简单的校验方法.而这篇则是 ...

最新文章

  1. 开源ImageFilter库v0.4:新增26种图片效果
  2. Unity中有两种Animation Clip
  3. kmd缅甸计算机学校,缅甸福星孔子课堂博睿国际学校分课堂举行2017年春节联欢会...
  4. 用js做分页,点击下一页时,直接跳到了最后一页——Number()的妙用
  5. 开源 免费 java CMS - FreeCMS1.3-数据对象-mail
  6. pku2192(并查集+枚举)
  7. 用viewpager实现图片轮播
  8. 【背包问题】基于matlab离散粒子群算法求解0-1背包问题【含Matlab源码 1342期】
  9. 【图像压缩】基于matlab GUI DCT图像无损压缩【含Matlab源码 726期】
  10. 分享一款TF/SD卡手机存储卡格式化修复工具
  11. Centos 操作系统常用log日志
  12. 给div添加蒙版(遮罩?)
  13. 【python爬虫】爬取《英雄联盟》英雄及皮肤图片数据
  14. 将当前列表视图导出到Excel中
  15. phpoffice 编辑excel文档
  16. 计算机专业考研390分是什么水平,考研初试390分被淘汰,复试到底发生了什么?...
  17. python字典创建、使用字典保存中国主要城市和对应邮编_Python字典及相关操作(内含例题)...
  18. MAX40026 280ps高速比较器开发资料原理图源代码
  19. Android linux firmware下载——续request_firmware之fw_path_para方式
  20. SuperMap iDesktop 单体化+发布服务+标签专题图制作

热门文章

  1. Running pipenv gives TypeError: 'module' object is not callable
  2. vue-qq 实践(一)
  3. 苹果mac休眠快捷键_Mac电脑睡眠、退出登录和关机快捷键有哪些?技巧来啦!
  4. Win10+VS2019编译Jpeg源码时缺少win32.mak文件的内容
  5. 服务器独享宽带和共享宽带有那些区别
  6. Android——横幅通知
  7. 〖Python 数据库开发实战 - Python与MySQL交互篇⑪〗- 项目实战- 完善新闻管理系统中轮询的交互判断
  8. 新单词 part 13
  9. MEMS光学器件— MEMS OXC(光交叉互连开关)
  10. win10开机自动打开http://go.microsoft.com/fwlink/?LinkID=219472clcid=0x409