第一步:定义ValidationResult类

public class ValidationResult {

    // 校验结果是否有错
private boolean hasErrors = false; // 存放错误信息的Map
private Map<String, String> errorMsgMap = new HashMap<>(); public boolean isHasErrors() {
return hasErrors;
} public void setHasErrors(boolean hasErrors) {
this.hasErrors = hasErrors;
} public Map<String, String> getErrorMsgMap() {
return errorMsgMap;
} public void setErrorMsgMap(Map<String, String> errorMsgMap) {
this.errorMsgMap = errorMsgMap;
} // 实现通用的 通过格式化字符串信息获取 所有错误结果的Message方法
public String getErrorMsg(){
return StringUtils.join(errorMsgMap.values().toArray(), ",");
}
}

第二步:定义ValidatorImpl实现类

/**
* InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
* Spring初始化完成后,会回调ValidatorImpl的afterPropertiesSet()方法
*/
@Component
public class ValidatorImpl implements InitializingBean { private Validator validator; // 实现校验方法并返回校验结果
public ValidationResult validate(Object bean){
ValidationResult validationResult = new ValidationResult();
Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean);
if(constraintViolationSet.size() > 0){
// 大于0 表示有错误
validationResult.setHasErrors(true);
for (ConstraintViolation<Object> constraintViolation : constraintViolationSet) {
String errorMsg = constraintViolation.getMessage();
String propertyName = constraintViolation.getPropertyPath().toString();
validationResult.getErrorMsgMap().put(propertyName, errorMsg);
}
}
return validationResult;
} @Override
public void afterPropertiesSet() throws Exception {
// 将hibernate validator通过工厂的初始化方式使其实例化
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}

第三步,在业务逻辑中调用

public class UserModel {

    private Integer id;

    @NotBlank(message = "name不能为空")
private String name; @NotNull(message = "性别不能为空")
private Byte gender; @NotNull(message = "年龄不能为空")
@Min(value = 0, message = "年龄必须小于0")
@Max(value = 150, message = "年龄不能大于150")
private Integer age; @NotNull(message = "手机号码不能为空")
@Size(min = 11, max = 11, message = "手机号码必须为11位")
private String telphone; @NotNull(message = "注册方式不能为空")
private String registerMode;
private String thirdPartyId; @NotNull(message = "密码不能为空")
private String encrptPassword;
    @Autowired
private ValidatorImpl validator; @Transactional
public void register(UserModel userModel) throws BusinessException {
if(userModel == null){
throw new BusinessException(EnumBusinessError.PARAMETER_VALIDATION_ERROR);
}
//
ValidationResult validationResult = validator.validate(userModel);
if(validationResult.isHasErrors()){
throw new BusinessException(EnumBusinessError.PARAMETER_VALIDATION_ERROR, validationResult.getErrorMsg());
}

SpringBoot 定义通过字段验证的更多相关文章

  1. SpringBoot之表单验证@Valid

    转自:https://www.cnblogs.com/chenlove/p/8708627.html SpringBoot提供了强大的表单验证功能实现,给我们省去了写验证的麻烦: 这里我们给下实例,提 ...

  2. [ASP.NET MVC]如何定制Numeric属性/字段验证消息

    原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字, ...

  3. C#基础(202)--类定义,字段与属性,自动属性,方法及常见错误

    c#类的定义规范 字段与属性的比较: 字段: 字段主要是为类的内部做数据交换交互使用,字段一般是private 字段可以赋值,也可以取值 当字段需要为外部数据提供数据的时候,请将字段封装为属性,而不是 ...

  4. django 表单验证和字段验证

    表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...

  5. 18.Shiro与Springboot整合下登陆验证UserService未注入的问题

    Shiro与Springboot整合下登陆验证UserService未注入的问题 前言: 刚开始整合的情况下,UserService一执行,就会报空指针异常. 看了网上各位大神的讲解,什么不能用ser ...

  6. 结构字段验证--validator.v9

    官网:https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Baked_In_Validators_and_Tags package va ...

  7. 【DRF框架】序列化组件——字段验证

    单个字段的验证 1.在序列化器里定义校验字段的钩子方法   validate_字段 2.获取字段的数据 3.验证不通过,抛出异常  raise serializers.ValidationError( ...

  8. Django项目:CRM(客户关系管理系统)--38--30PerfectCRM实现King_admin编辑自定义字段验证

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  9. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Linux各文件颜色的含义

    Linux系统中文件有多种颜色,不同颜色文件代表不同类型的文件,具体如下: 蓝色:目录 绿色:可执行文件 红色:压缩文件 浅蓝色:链接文件 白色:普通文件 黄色:设备文件

  2. CentOS firewalld 防火墙操作

    Centos 7 开启端口CentOS 7 默认没有使用iptables,所以通过编辑iptables的配置文件来开启80端口是不可以的 CentOS 7 采用了 firewalld 防火墙 如要查询 ...

  3. std::deque

    deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素.但它又与vector不同,deque支持高效插入和删除容器的头部元素 ...

  4. iOS 导航栏rgb值与设置的有差异

    转:http://b2cloud.com.au/how-to-guides/bar-color-calculator-for-ios7-and-ios8/ 计算:http://htmlpreview. ...

  5. [POJ] Brackets Sequence

    This problem can be solved elegantly using dynamic programming. We maintain two arrays: cnt[i][j] -- ...

  6. datagridview数据导出到excel

    /// <summary> /// 导出Excel /// </summary> /// <param name="mydgv">控件 Data ...

  7. Pipeline inbound

    精进篇:netty源码死磕7  巧夺天工--Pipeline入站流程详解 1. Pipeline的入站流程 在讲解入站处理流程前,先脑补和铺垫一下两个知识点: (1)如何向Pipeline添加一个Ha ...

  8. Open System Interconnection

    https://zh.wikipedia.org/wiki/Secure_Shell Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所 ...

  9. IO流入门-第六章-FileReader_FileWriter复制

    利用FileReader和FileWriter进行复制粘贴 /* 文件复制粘贴 只能复制纯文本文件 2017/4/13 */ import java.io.*; public class FileRe ...

  10. python return中的or和and语句

    python return中的or和and语句 1.二元运算: 如果一个True,一个False或两个false: return True and False # 返回False return Tru ...