利用javax.validation实现对bean属性校验
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属性校验的更多相关文章
- spring利用后置处理器初始化bean属性
spring利用后置处理器初始化bean属性 参考:http://blog.csdn.net/heyutao007/article/details/50326793 @Configurable @En ...
- Bean Validation技术实现对Javabean的校验
概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validat ...
- spring boot中使用javax.validation以及org.hibernate.validator校验入参
这里springboot用的版本是:<version>2.1.1.RELEASE</version> 自带了hibernate.validator,所以不用添加额外依赖 1.创 ...
- Android 利用xUtils框架实现对sqllite的增删改查
首先下载xUtils,下载地址:https://github.com/wyouflf/xUtils 把下载好的文件压缩,把里面的jar包拷进项目中如图所示: 这里新建一个User类进行测试增删改查 ...
- 利用SMB jcifs实现对windows中的共享文件夹的操作
需求是在本地上传文件到服务器上,服务器是windows的,使用共享文件夹提供权限给你的. 利用第三方: CIFS (Common Internet File System) SMB(Server Me ...
- 利用shell脚本实现对mysql数据库的备份
#!/bin/bash #保存备份个数 number=3 #备份保存路径 backup_dir=/root/mysqlbackup #日期 dd=`date +%Y%m%d` #备份工具 tool=m ...
- 利用ini_set()函数实现对php配置文件的修改
PHP的配置文件是php.ini,如果要开启或者关闭扩展,还有设置一些模块的相关配置是,就得对该文件进行修改, 修改的方法也很简单,打开php.ini找到对应项直接修改,修改之后需要重新启动才能生效. ...
- 利用COM组件实现对WORD书签处写入值
using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Wo ...
- 利用COM组件实现对WORD书签各种操作大全,看这一篇就够了
有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片. 脑海中迅速闪过好几种组件,openxml组件,com组件,npoi.为了减少程序画复杂表格,我们选用了com组件+ ...
- 使用jmeter实现对jar包的调用
一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...
随机推荐
- Linux-分区-fdisk-mkfs-mount
- .NET技术面试题系列(2) -sql server数据库优化规范
1.数据库优化规范 a.索引 每个表格都要求建立主键,主键上不一定需要强制建立聚集索引. 聚集索引,表中存储的数据按照索引的顺序存储,即逻辑顺序决定了表中相应行的物理顺序,因此聚集索引的字段值应是不会 ...
- (保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警
前言 近期在琢磨Zabbix邮箱报警的功能,但是网上的教程通常是4.0或5.0版本Zabbix,并使用Python2.7环境,运行在新版本Zabbix6.0上有颇多问题,为此我基于原先教程修改基于Za ...
- [转帖]tcplife的使用
https://www.rutron.net/posts/2203/bcc-tcplife-usage/ 这篇文档主要演示了 tcplife(Linux eBPF/bcc) 工具的使用. 示例 tcp ...
- [转帖]如何在KingbaseES数据库查看数据库和表的大小
关键字 kingbaseES,数据库大小,表大小 1.查看单个数据库的大小 使用ksql连接到数据库,使用sys_database_size函数 kapp=# select sys_database_ ...
- 【转帖】MySQL 8.0.32如期而至
MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本.去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布My ...
- [转帖] 常见的Socket网络异常场景分析
https://www.cnblogs.com/codelogs/p/16001770.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 在目前微服务的 ...
- 人工智能GPT科普知识的简单总结
人工智能GPT相关知识的简单总结 背景 工作已经很久, 工作十几年来有过好多波新的技术浪潮. 但是每次都离技术前沿比较远. 最近发现只低头拉车是一个没有前途的行为. 人生很短, 选择很重要, 不仅要低 ...
- [翻译]-hugePage的简要说明--部分内容
hugePage的简要说明 本篇文档的主旨给linux内核支持的大页内存做一个简要的概述. 大页内存的实现是建立在大多数现代架构所都支持的多级页大小的特性之上的. 举例: x86架构下大部署CPU 的 ...
- echarts中x轴文字太长换行的几种方式
我们在使用echarts中,可能会遇见文字太长.导致显示不完全. 我们可以使用换行来处理 第一方式直接使用 \n 文字直接换行显示 使用\n <!DOCTYPE html> <htm ...