1.使用场景介绍

controller层对传入的bean的属性进行非空、属性长度等合法性的校验。
传统的方式是我们要自己写if…else…去判断,比较麻烦。

2.实现效果

3.代码介绍

代码结构:

pom.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

3.1 工具类

/**
* @Description: 校验结果
* @Author laoxu
* @Date 2020/5/27 23:30
**/
@Data
public class ValidationResult {
// 校验结果是否有错
private boolean hasErrors; // 校验错误信息
private Map<String, String> errorMsg;
}
public class ValidationUtils {
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); public static <T> ValidationResult validateEntity(T obj) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
// if( CollectionUtils.isNotEmpty(set) ){
if (set != null && set.size() != 0) {
result.setHasErrors(true);
Map<String, String> errorMsg = new HashMap<String, String>();
for (ConstraintViolation<T> cv : set) {
errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());
}
result.setErrorMsg(errorMsg);
}
return result;
} public static <T> ValidationResult validateProperty(T obj, String propertyName) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class);
if (set != null && set.size() != 0) {
result.setHasErrors(true);
Map<String, String> errorMsg = new HashMap<String, String>();
for (ConstraintViolation<T> cv : set) {
errorMsg.put(propertyName, cv.getMessage());
}
result.setErrorMsg(errorMsg);
}
return result;
} /**
* bean整体校验,把所有违规信息,输出String。
*/
public static String validate(Object o, Class<?>... groups){
Set<ConstraintViolation<Object>> resultSet=validator.validate(o, groups);
if(resultSet == null || resultSet.size() ==0){
return null;
}
StringBuilder sb = new StringBuilder();
for(ConstraintViolation<Object> constraintViolation : resultSet) {
sb.append(constraintViolation.getMessageTemplate()).append(",");
}
return sb.substring(0,sb.length()-1);
} }

3.2 模型类

@Data
public class Student {
@Length(max=20,message="姓名长度不能大于20")
@NotEmpty(message="姓名不能为空")
private String name;
@Range(min = 0, max = 1, message = "性别只能输入只能输入0或1")
private Integer gender;
private Integer age;
@Email
private String email;
@NotBlank(message = "身份证号不能为空")
@PhoneNumber
private String phone;
}

3.3 注解类

/**
* 自定义验证
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
// 指定真正实现校验规则的类
@Constraint(validatedBy = PhoneValidator.class)
public @interface PhoneNumber {
String message() default "手机号不合法";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

3.4 实现类

public class PhoneValidator implements ConstraintValidator<PhoneNumber,String> {
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext)
{
return s.length()==11;
}
}

3.5 控制器

@RestController
@RequestMapping("/api/student")
public class StudentController {
private static final Logger log = LoggerFactory.getLogger(StudentController.class); @PostMapping("add")
public String add(@RequestBody Student student){
ValidationResult validationResult = ValidationUtils.validateEntity(student);
if(validationResult.isHasErrors()){
return validationResult.getErrorMsg().toString();
} return "添加成功"; }
}

利用javax.validation实现对bean属性校验的更多相关文章

  1. spring利用后置处理器初始化bean属性

    spring利用后置处理器初始化bean属性 参考:http://blog.csdn.net/heyutao007/article/details/50326793 @Configurable @En ...

  2. Bean Validation技术实现对Javabean的校验

    概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validat ...

  3. spring boot中使用javax.validation以及org.hibernate.validator校验入参

    这里springboot用的版本是:<version>2.1.1.RELEASE</version> 自带了hibernate.validator,所以不用添加额外依赖 1.创 ...

  4. Android 利用xUtils框架实现对sqllite的增删改查

    首先下载xUtils,下载地址:https://github.com/wyouflf/xUtils  把下载好的文件压缩,把里面的jar包拷进项目中如图所示: 这里新建一个User类进行测试增删改查 ...

  5. 利用SMB jcifs实现对windows中的共享文件夹的操作

    需求是在本地上传文件到服务器上,服务器是windows的,使用共享文件夹提供权限给你的. 利用第三方: CIFS (Common Internet File System) SMB(Server Me ...

  6. 利用shell脚本实现对mysql数据库的备份

    #!/bin/bash #保存备份个数 number=3 #备份保存路径 backup_dir=/root/mysqlbackup #日期 dd=`date +%Y%m%d` #备份工具 tool=m ...

  7. 利用ini_set()函数实现对php配置文件的修改

    PHP的配置文件是php.ini,如果要开启或者关闭扩展,还有设置一些模块的相关配置是,就得对该文件进行修改, 修改的方法也很简单,打开php.ini找到对应项直接修改,修改之后需要重新启动才能生效. ...

  8. 利用COM组件实现对WORD书签处写入值

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Wo ...

  9. 利用COM组件实现对WORD书签各种操作大全,看这一篇就够了

    有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片. 脑海中迅速闪过好几种组件,openxml组件,com组件,npoi.为了减少程序画复杂表格,我们选用了com组件+ ...

  10. 使用jmeter实现对jar包的调用

    一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...

随机推荐

  1. [转帖]命令行参数--与-D的区别

    https://juejin.cn/post/7238420276228341815   Spring Boot 学习笔记 我们要想了解这两者之间的差异,首先来看一个案例:   bash 复制代码 # ...

  2. [转帖]【教程】如何在不同架构打包Docker镜像

    https://docs.qsnctf.com/qsnctf/37674.html 前言 大家在使用Docker的时候经常会遇到一个问题,就是受用机和本级不是同一架构.就比如小编使用的就是新版本的Ma ...

  3. [转帖]FIO – IO压力测试工具

    https://blog.csdn.net/younger_china/article/details/71129541 <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于d ...

  4. [转帖]Day63_Kafka(一)

    第一讲 Kafka基础操作 课程大纲 课程内容 学习效果 掌握目标 Kafka简介 消息队列 掌握 Kafka简介 Kafka分布式环境 Kafka操作 Kafka shell 掌握 Kafka ap ...

  5. 【转帖】JVM的发展历程

    目录 1.Sun Classic VM 2.Exact VM 3.Sun HotSpot(主流) 4.JRockit 5.IBM J9 6.下一代虚拟机Graal VM 1.Sun Classic V ...

  6. [转帖]深度解读:传奇的Alpha处理器

    https://jishuin.proginn.com/p/763bfbd2cf85 来源:科技新报(台) 长期关心处理器技术发展者,这20年来,很难不每隔一段时间就会偶尔听到「这技术受Alpha影响 ...

  7. 【一】LaTeX的安装和使用、安装TeXstudio、中文界面输出设置

    安装方法一:(推荐) 下载链接·:http://tug.org/texlive/acquire-netinstall.html 下载zip,然后运行Windows批处理脚本(install-tl-wi ...

  8. C++ Boost 实现异步端口扫描器

    端口扫描是一种用于识别目标系统上哪些网络端口处于开放.关闭或监听状态的网络活动.在计算机网络中,端口是一个虚拟的通信端点,用于在计算机之间传输数据.每个端口都关联着特定类型的网络服务或应用程序.端口扫 ...

  9. ::v-deep样式穿透

    //如果不加样式穿透,vue永远会在input后面加唯一样式字段data-v-1d9b105c //::v-deep拼在哪个位置,哪个位置就有唯一标识data-v-1d9b105c .divBox : ...

  10. Laravel使用es

    1.es是什么呢? ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发 ...