这里针对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. [总结]FFMPEG视音频编解码零基础学习方法【转】

    本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFM ...

  2. android编译ffmpeg+x264

    下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...

  3. 理解z-index和css中的层叠顺序问题(大神技术博的读后感?)

    一直对 z-index不太理解,今天看到了大神的博客...http://www.zhangxinxu.com/wordpress/tag/z-index/ 1.层叠上下文:是一个名词!是一个性质!此时 ...

  4. Android PullTorefreshScrollview回到顶部

    列表滑动下面显示按钮,点击按钮回到顶部的功能,一般scrollview会有滑动监听的事件,通过setOnScrollChangeListener()滑动监听滑动的距离来判断是否显示按钮就好了,但是Pu ...

  5. javaweb 之 文件上传与下载

    1.文件上传的原理分析 1.1文件上传的必要前提: a.提供form表单,method必须是post b.form表单的enctype必须是multipart/form-data c.提供input ...

  6. android 打包工具

    sdk.jar-修改路径-JarToDex-DexToSmali-复制文件

  7. Navicat for Mysql 关于1130错误,无法正常方法解决的解决办法。

    本人因为失误操作,不小心将mysql 玩崩了.导致一直报1130错误,无法进入. 看了很多网上的帖子,但是那些办法都行不通.最后通过好友的指点,解决了这个问题.   1.停止MySQL服务,执行net ...

  8. Node.js获取本机IP

    function getIPAdress() { var interfaces = require('os').networkInterfaces(); for (var devName in int ...

  9. 在应用层通过spring特性解决数据库读写分离

    如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...

  10. Powerpivot PowerBI相关组件下载安装(附操作截图)

    加载方式:com加载项加载方法: 点击Excel界面[文件]→[选项]→[加载项]→[COM加载项]→[转到] Excel2013加载PowerView Excel216PowerQuery不需要加载 ...