这里针对springboot项目结构

maven添加:  

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>

  

controller(@Validated、@Valid)

@PostMapping("/test.do")
public JSONMessageResponse test(@Validated @RequestBody TestVO testVO) { }

TestVO

public class TestVO {
@NotEmpty(message = "名称不能为空")
String name; // 名称 @ListNotEmptyNull(message = "不能为空的数组") // 自定义
@ListSize(min = 1, max = 5, message = "错误的数组大小")
@Valid
List<UserVO> list;
}

  

public class UserVO {
@NotEmpty(message = "名称不能为空")
String name; // 名称
}

  

错误拦截

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
BindingResult bindingResult = ex.getBindingResult();
String errorMessage = "参数校验失败"; for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorMessage += ", " + fieldError.getDefaultMessage();
}
JSONMessageResponse error = SystemResultUtil.error(5006, errorMessage);
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
}

查看返回(返回结构可自定义,这里不详细指出)

{
"code": 5006,
"message": "参数校验失败,名称不能为空",
"status": 1
}

对于列表的操作,可以自定义:例如下面的指定list的大小(当然,自带的@Size可以实现)

/**
* 指定列表的大小
*
* @author sky.javaweb@qq.com
* @version 1.0
* @date 2019-01-07
*/
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ListSizeValidationImpl.class)////此处指定了注解的实现类为ListSizeValidationImpl
public @interface ListSize {
int min() default 0; int max() default Integer.MAX_VALUE; String message() default "List集合大小错误"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; /**
* 定义List,为了让Bean的一个属性上可以添加多套规则
*/
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@interface List {
ListSize[] value();
} }

 

/**
* @author sky.javaweb@qq.com
* @version 1.0
* @date 2019-01-07
*/
@Service
public class ListSizeValidationImpl implements ConstraintValidator<ListSize, List> { private int min;
private int max; @Override
public void initialize(ListSize constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
} @Override
public boolean isValid(List list, ConstraintValidatorContext context) {
if (list != null) {
if (list.size() < min || list.size() > max) {
return false;
}
}
return true;
}
}

使用如下:

    @ListSize(min = 2, max = 5, message = "无效的案例图片")
List<String> imageList; // 图片

  

{
"code": 5006,
"message": "参数校验失败, 无效的案例图片",
"status": 1
}

  

  

validation-api参数校验的更多相关文章

  1. 徒手生撸一个验证框架,API 参数校验不再怕!

    你们之中大概率早已练就了代码的拷贝.粘贴,无敌的码农神功,其实做久了业务功能开发,练就这两个无敌神功,那是迟早的事儿.今天先抛一个小问题,来打通你的任督二脉,就是很好奇的问一下:业务功能开发中,输入参 ...

  2. 寻找写代码感觉(十六)之 集成Validation做参数校验

    写在前面 今天是大年初五了... 不知不觉,又要上班了,美好的假期只剩一天了,有点不舍呢! 也不知道为什么,总感觉像在做梦一样,像没睡醒一样,并不是因为眼睛小,更多应该是自寻烦恼,想得多罢了. 参数校 ...

  3. Java Bean Validation(参数校验) 最佳实践

    转载来自:http://www.cnblogs.com 参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的 ...

  4. hibernate validation 手动参数校验 不经过spring

    /** * 校验工具类 * @author wdmcygah * */ public class ValidationUtils { private static Validator validato ...

  5. API参数如何验证?别纠结,拿去用就是

    今天我们主要分享项目实战中,另一种常用的参数校验框架 Hibernate Validator,请准备好小板凳,我们的分享开始. 1. 是啥? 先抛一张图,锻炼一下你的观察力. 通过上图有没有发现,数据 ...

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

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

  7. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  8. 2. Bean Validation声明式校验方法的参数、返回值

    你必须非常努力,才能干起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...

  9. 利用 Bean Validation 来简化接口请求参数校验

    团队新来了个校招实习生静静,相互交流后发现竟然是我母校同实验室的小学妹,小学妹很热情地认下了我这个失散多年的大湿哥,后来... 小学妹:大湿哥,咱们项目里的 Controller 怎么都看不到参数校验 ...

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

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

随机推荐

  1. 深入浅出VGA和DVI接口

    由CrazyBingo修改…… 前言:目前显示器的主流接口是VGA.DVI以及HDMI,再加上一个比较少有的Displayport接口,一共可归为四类.相信不少消费者对这些接口认识并不多,特别是普通用 ...

  2. [SCOI 2005] 栅栏

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1082 [算法] 首先二分“最多得到的符合条件的木板数”,检验时可以使用DFS,但是, ...

  3. SYN-Flood防御方法之一Synproxy

    SYN-Flood攻击: 攻击者发送大量的SYN给服务器. 服务器必须针对每一个SYN请求回送一个SYN-ACK 应答包,此时服务器就必须保持一条半开放的连接,直到接收到一个对应的ACK应答包为止. ...

  4. ITWorld:2014年全球最杰出的14位编程天才

    近日,ITWorld 整理全球最杰出的 14 位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1.Jon Skeet 个人名望:程序技术问答网站 Stack Overflow 总排 ...

  5. java同步锁的正确使用

    同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同 ...

  6. less使用方法总结

    1 变量 我们常常在 CSS 中 看到同一个值重复多次,这样难易于代码维护. 理想状态,应是下面这样: const bgColor="skyblue"; $(".post ...

  7. C#中SQL参数传入空值报错解决方案

    C#中的null与SQL中的NULL是不一样的,SQL中的NULL用C#表示出来就是DBNull.Value. 注意:SQL参数是不能接受C#的null值的,传入null就会报错. 下面我们看个例子: ...

  8. 多年js学习累计总结

    http://www.codesec.net/list/6/ 大神http://www.cnblogs.com/tylerdonet/p/5543813.html

  9. hdu 1394 Minimum Inversion Number 【线段树求逆序数】

    之前写过树状数组的,再用线段树写一下--- #include<cstdio> #include<cstring> #include<iostream> #inclu ...

  10. git + grunt 环境配置

        1⃣️ssh key生成步骤 一.设置Git的user.name和user.email: $ git config --global user.name "xiongzuyan&qu ...