好久没在这平台写博客了,最近整理了这东西,先给出总结

//  @Valid只能用在controller,@Validated可以用在其他被spring管理的类上
// @Valid可以加在成员变量上(本人一般只有在嵌套查询的时候才会使用这个注解)
// @Validated可以分组
// @Valid可以加在成员变量上,所以可以嵌套校验
以及我在总结时随便写的类(东西都在代码里,(*^▽^*))
@RestController
@RequestMapping("/check")
@Validated
public class ParamCheckInController { @Autowired
private ParamCheckInService paramCheckInService; @PostMapping("/postDemo")
public Node postDemo(@RequestBody @Validated Node node) {
return node;
}
@GetMapping("/getDemo")
public Node getDemo(@Validated Node node) {
paramCheckInService.test("a","b");
return node;
}
@GetMapping("/getDemo2")
public String getDemo2( @NotEmpty String s) {
return s;
}
@PostMapping("/groupDemo1")
public Book groupDemo1(@RequestBody @Validated Book book) {
return book;
}
@PostMapping("/groupDemo2")
public Book groupDemo2(@RequestBody @Validated({InsertGroup.class,}) Book book) {
return book;
}
@PostMapping("/groupDemo3")
public Node groupDemo3(@RequestBody @Validated({InsertGroup.class,UpdateGroup.class}) Node node) {//还有啥@Validated分组是有序校验的之类,感觉没啥用
return node;
}
}
@Data
class Node implements Serializable {
@NotBlank(message = "名称不能为空")
private String name;
@NotEmpty(groups = UpdateGroup.class,message = "性别不能为空")
private String sex;
@NotNull(groups =InsertGroup.class,message = "年龄不能为空")
@Max(value = 200,message = "age不能大于200")
private Integer age;
@Valid //对下层进行嵌套调用
@NotEmpty(message = "bookList不能为空")
private List<Book> bookList;
}
@Data
class Book implements Serializable{
@NotEmpty(groups = {UpdateGroup.class, Default.class}, message = "更新时id不能为空")
private String id;
@NotNull(groups = {InsertGroup.class}, message = "新增时bookName不能为空")
private String bookName;
}
@Service
@Slf4j
@Validated
public class ParamCheckInService {
public @NotNull(message = "返回值不允许为空") String test(@NotEmpty(message = "s不能为空") String s,String b){
return b;
}
}

上面的类是本人在总结知识点时自己测试的,而且因为要返回给前端,所以还要全局异常捕获,或者在每个方法用BindResult接收。

@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({MethodArgumentNotValidException.class,BindException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Result<T> handleMethodArgumentNotValidException(Exception exception) {
StringBuilder errorInfo = new StringBuilder();
BindingResult bindingResult=null;
if(exception instanceof MethodArgumentNotValidException){
bindingResult= ((MethodArgumentNotValidException)exception).getBindingResult();
}
if(exception instanceof BindException){
bindingResult= ((BindException)exception).getBindingResult();
}
for(int i = 0; i < bindingResult.getFieldErrors().size(); i++){
if(i > 0){
errorInfo.append(",");
}
FieldError fieldError = bindingResult.getFieldErrors().get(i);
errorInfo.append(fieldError.getField()).append(" :").append(fieldError.getDefaultMessage());
}
return Result.error(errorInfo.toString());
} @ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public Result<T> handleDefaultException(Exception exception) {
return Result.error("其他错误");
}
}

还有需要注意的一点是在分组时,接口如果不继承Default的话,有分组校验的接口是必须加上Default.class的否则会使一些校验注解无效

所以我会在分组的接口上继承Default,不然需要分组的参数都要加Default.class看着不舒服~(controller看着简洁就行,嘿嘿~)

public interface UpdateGroup extends Default {
}
public interface InsertGroup extends Default {
}

 

springboot @valid与@validated的参数校验使用总结的更多相关文章

  1. SpringBoot Validation优雅的全局参数校验

    前言 我们都知道在平时写controller时候,都需要对请求参数进行后端校验,一般我们可能会这样写 public String add(UserVO userVO) { if(userVO.getA ...

  2. SpringBoot实现通用的接口参数校验

    本文介绍基于Spring Boot和JDK8编写一个AOP,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例 ...

  3. 【Java】使用@Valid+BindingResult进行controller参数校验

    @Valid @Valid注解用于校验,所属的包: javax.validation.Valid. 你可以定义实体,在实体的属性上添加校验规则,在API接收数据时添加@Valid注解,这时你的实体将会 ...

  4. springboot~@Valid注解对嵌套类型的校验

    @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用: 实体: ...

  5. spring mvc +@Valid +@RequestBody 来做参数校验返回400,并且不显示具体message 如何解决

    参考文档: https://www.oschina.net/question/115867_2282711   谢谢原作者

  6. SpringBoot 参数校验的方法

    Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...

  7. SpringBoot 如何进行参数校验,老鸟们都这么玩的!

    大家好,我是飘渺. 前几天写了一篇 SpringBoot如何统一后端返回格式?老鸟们都是这样玩的! 阅读效果还不错,而且被很多号主都转载过,今天我们继续第二篇,来聊聊在SprinBoot中如何集成参数 ...

  8. 【springboot】@Valid参数校验

    转自: https://blog.csdn.net/cp026la/article/details/86495659 扯淡: 刚开始写代码的时候对参数的校验要么不做.要么写很多类似 if( xx == ...

  9. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

随机推荐

  1. Cesium加载倾斜摄影数据

    (1)倾斜摄影数据仅支持 smart3d 格式的 osgb 组织方式, 数据目录必须有一个 “Data” 目录的总入口, “Data” 目录同级放置一个 metadata.xml 文件用来记录模型的位 ...

  2. 开启CAN通信学习(二)——基于Kvaser的CAN通信案例

    1 案例硬件介绍 Kvaser是瑞典的一家专门提供CAN和LIN总线分析仪及数据记录仪的公司,在CAN产品开发领域已经有近30年的经验,本案例选择的CAN通信硬件型号是Kvaser Leaf Ligh ...

  3. 在centOS7上安装一套java运行环境

    前提:更换centos的默认yum源,提高下载速度. 备份系统自带的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS- ...

  4. Hexo博客部署到远程仓库(Conding、Gitee、Github)

    一.本地环境搭建 1.安装Git Git可以有效.高速的处理各种项目版本管理.也就是用来管理你的hexo博客文章,上传到GitHub的工具. Git下载地址 安装好了之后使用git -version查 ...

  5. tomcat启动失败的解决办法

    初次安装tomcat启动失败的解决办法: 1.CATALINA_HOME    C:\Program Files\apache-tomcat-8.5.242.path  %CATALINA_HOME% ...

  6. Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式

    API  Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...

  7. Java—构造方法及this/super/final/static关键字

    构造方法 构建创造时用的方法,即就是对象创建时要执行的方法. //构造方法的格式: 修饰符 构造方法名(参数列表) { } 构造方法的体现: 构造方法没有返回值类型.也不需要写返回值.因为它是为构建对 ...

  8. 设计模式:装饰者模式介绍及代码示例 && JDK里关于装饰者模式的应用

    0.背景 来看一个项目需求:咖啡订购项目. 咖啡种类有很多:美式.摩卡.意大利浓咖啡: 咖啡加料:牛奶.豆浆.可可. 要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客 ...

  9. 源码解析JDK1.8-HashMap链表成环的问题解决方案

    前言 上篇文章详解介绍了HashMap在JDK1.7版本中链表成环的原因,今天介绍下JDK1.8针对HashMap线程安全问题的解决方案. jdk1.8 扩容源码解析 public class Has ...

  10. idea配置ssm框架

    详细教程如下:https://blog.csdn.net/GallenZhang/article/details/5193215 https://blog.csdn.net/qq_28008917/a ...