对于前端来的数据,后端难免要进行合法性校验,这里可以采用springboot自带的Validated注解来实现,详细方法如下:

实体类:

public class User implements Serializable {
//  @NotNull(message = "id can not be null")private Integer id;private String name;@NotEmpty(message = "username can not be empty")@Length(max = 40, min = 5, message = "username length must between 5 and 10")private String username;@Emailprivate String email;//@Pattern(regexp = "^((13[0-9])|(15[^4,\\\\D])|(18[0,5-9]))\\\\d{8}$",//message = "phone number illegal")@Phone//自定义的注解private String phone;private Integer latest;@NotEmpty(message = "passwd can not be empty")@Length(max = 42, min = 5, message = "password lenth must between 5 and 42")private String passwd;private byte isDel;//默认值为0private Timestamp lastAlter;
}
再在对应的web接口添加@Validated注解即可:

在校验不通过的时候,springboot会抛MethodArgumentNotValidException异常,直接把异常信息给客户端不友好,我们可以使用springboot的全局异常捕获来处理此异常,代码如下:

对于简单参数的非空等校验可以使用Spring提供的Assert类,参考博客:https://blog.csdn.net/qq_41633199/article/details/105165740。有时候springboot自带注解的可能不能满足我们的使用,这时我们可以自己实现一个注解与校验逻辑来进行加强,方式如下:

1:先新增一个注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint( validatedBy = PhoneConstraint.class)
//指定该注解在对应的属性上可以重复使用
@Repeatable(value = Phone.List.class)
public @interface Phone {String message() default "tfq.validator.constraints.phone.message";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@interface List{Phone[] value();}
}

注解的groups()与payload()的作用可以参考这篇文章:https://reflectoring.io/bean-validation-with-spring-boot/

以及https://blog.csdn.net/blueheart20/article/details/88817754

再新增校验类PhoneConstraint.java,引用springboot的一个接口,以实现我们的校验逻辑以及确保校验类能被springboot加载到。

public final class PhoneConstraint implements ConstraintValidator<Phone, Object> {
private static final Pattern phonePattern = Pattern.compile("^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$");
    {System.out.println("自定义直接被调用了");}@Overridepublic void initialize(Phone constraintAnnotation) {}@Overridepublic boolean isValid(Object phone, ConstraintValidatorContext constraintValidatorContext) {String phoneStr = "";if (phone instanceof String || phone instanceof Number){phoneStr = String.valueOf(phone);} else {return false;}if (phoneStr == null || "".equals( phoneStr.trim() )){return true;}Matcher phoneMatcher = phonePattern.matcher(phoneStr);return phoneMatcher.matches();}

这里的实现类不需要申明为bean,在第一次需要校验的时候,springboot会加载此类,生成一个此类的对象,后续校验直接通过原对象调用方法进行校验,就是说默认是单例的。

springboot参数校验,对象的某属性校验相关推荐

  1. springboot参数校验validation

    文章目录 1. 引入 2. 基本使用 2.1 引入依赖 2.2 基本使用 2.3 注解介绍 2.4 返回值完善 2.5 统一异常处理 2.6 @Valid和@Validate注解 3. 分组校验 4. ...

  2. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  3. java注解检验集合对象_Java 对list对象进行属性校验

    ps:对list对象进行属性校验. @Validated:可以用在类型.方法和方法参数上.但是不能用在成员属性(字段)上 @Valid:可以用在方法.构造函数.方法参数和成员属性(字段)上 user实 ...

  4. SpringBoot参数校验

    使用传统方式的弊端 public String addUser(User user) {if (user == null || user.getId() == null || user.getAcco ...

  5. java自定义注解实现校验对象属性是否为空

    前面学习了如何自定义一个注解:java如何优雅的自定义一个注解 下面来实战演示一下如何使用自定义注解做一些实际的功能.比如校验对象属性是否为空. 一.自定义一个NotNull注解 我们自定义一个Not ...

  6. java 验证int长度_java使用注解校验对象属性值数据长度

    java使用注解校验对象属性值数据长度 定义注解 import java.lang.annotation.*; /** * describe:定义注解 * current user Maochao.z ...

  7. Springboot 参数校验@Valid @Validated(最新最全)

    Springboot 参数校验@Valid @Validated(最新最全) 提示:统一参数校验,异常处理 文章目录 Springboot 参数校验@Valid @Validated(最新最全) 前言 ...

  8. java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)

    包装类型pojo参数绑定 需求 商品查询controller方法中实现商品查询条件传入. 实现方法 第一种方法:在形参中 添加HttpServletRequest request参数,通过reques ...

  9. vue2知识点:组件的props属性、非props属性、props属性校验

    文章目录 3.10props属性 举例:父组件给子组件传递属性msg和greetText,子组件用属性a和b接收,并打印输出 3.11props校验 举例 3.12非props属性 举例:定义子组件设 ...

最新文章

  1. python判断素数的函数_如何用python求素数
  2. SpringBoot + MyBatis + MySQL 读写分离实战
  3. Error in match.names(clabs, names(xi)) : names do not match previous names
  4. SAP B/P 初步研究(二)
  5. Java实现简单的队和栈
  6. 关于EL表达式取值的问题
  7. django 日志配置
  8. 前端实战:从零到一实现H5拼图小游戏(附源码)
  9. rtmp推流工具_EV录屏推流抖音直播教程——墨涩网
  10. c#进阶一:使用ILDASM来查看c#中间语言
  11. oracle imp 跳过表,关于oracle imp 导入避开若干表
  12. php把图片处理成圆形透明的图片,做圆形透明头像【微信头像】
  13. Oracle 12C新特性总结
  14. 计算机网络——常考的面试题
  15. 亥姆霍兹线圈定义与应用
  16. 社会知觉:我们如何理解他人
  17. 应用于双麦克风小型手持设备的语音降噪方法
  18. aop编程时出现错误信息:java.lang.NoClassDefFoundError
  19. 书法练字帖纸——井字格是不一样的格
  20. 机器学习之朴素贝叶斯 1

热门文章

  1. FTP协议常用COMMAND和状态码
  2. IDC:PC时代将结束 微软谷歌是最大输家和赢家
  3. python turtle调整画布宽高_turtle.screensize改变不了窗口大小?
  4. 易语言网盘服务器源码_使用使用rclone挂载OneDrive到服务器
  5. android自定义绘制二叉树,安卓数据结构04-二叉树
  6. android timer后函数继续执行_一切从android的handler说起(三)
  7. python库和模块的区别_在函数中导入python库与全局导入之间有何区别?
  8. linux如何更改服务器时间格式,Linux中date命令,格式化输出,时间设置
  9. MyEclipse、eclipse代码自动补全
  10. 如何linux中文改为英文,CentOS系统如何将中文语言改成英文