使用 Bean Validation 解决业务中参数校验

  • 方法二:3.自定义封装ValidatorImpl类

  • 方法二:4.自定义封装ValidationResult 类

  • 5.controller方法入参加入校验

  • Bean Validation 的约束

  • Hibernate Validator 附加的约束

  • 小结

前言

============================================================

在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有点麻烦:

  • 验证代码繁琐,重复劳动

  • 方法内代码显得冗长

  • 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码


叙述

============================================================

Bean Validation是一个通过配置注解来验证参数的框架,它包含两部分Bean Validation API和Hibernate Validator。

  • Bean Validation API是Java定义的一个验证参数的规范。

  • Hibernate Validator是Bean Validation API的一个实现。


@Valid和Validated的比较


Spring Validation验证框架对参数的验证机制提供了@Validated(Spring’s JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。

@Valid : 没有分组功能,可以用在方法、构造函数、方法参数和成员属性(field)上,如果一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@valid,才能验证待验证对象中的成员属性

@Validated :提供分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,用在类型、方法和方法参数上。但不能用于成员属性(field)。

两者都可以用在方法入参上,但都无法单独提供嵌套验证功能,都能配合嵌套验证注解@Valid进行嵌套验证。

嵌套验证示例:

public class ClassRoom{

@NotNull

String name;

@Valid // 嵌套校验,校验参数内部的属性

@NotNull

Student student;

}

@GetMapping(“/room”) // 此处可使用 @Valid 或 @Validated, 将会进行嵌套校验

public String validator(@Validated ClassRoom classRoom, BindingResult result) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

BindingResult 的使用

BindingResult必须跟在被校验参数之后,若被校验参数之后没有BindingResult对象,将会抛出BindException。

@GetMapping(“/room”)

public String validator(@Validated ClassRoom classRoom, BindingResult result) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

不要使用 BindingResult 接收String等简单对象的错误信息。简单对象校验失败,会抛出 ConstraintViolationException。主要就是接不着,你要写也算是没关系…

// ❌ 错误用法,也没有特别的错,只是 result 是接不到值。

@GetMapping(“/room”)

@Validated // 启用校验

public String validator(@NotNull String name, BindingResult result) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

修改校验失败的提示信息

可以通过各个校验注解的message属性设置更友好的提示信息。

public class ClassRoom{

@NotNull(message = “Classroom name must not be null”)

String name;

@Valid

@NotNull

Student student;

}

@GetMapping(“/room”)

@Validated

public String validator(ClassRoom classRoom, BindingResult result, @NotNull(message = “姓名不能为空”) String name) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

message属性配置国际化的消息也可以的,message中填写国际化消息的code,在抛出异常时根据code处理一下就好了。

@GetMapping(“/room”)

@Validated

public String validator(@NotNull(message = “demo.message.notnull”) String name) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

// message_zh_CN.properties

demo.message.notnull=xxx消息不能为空

// message_en_US.properties

demo.message.notnull=xxx message must no be null


hibernate-validator 的使用


1.引入pom

org.hibernate

hibernate-validator

5.3.1.Final

2.dto入参对象属性加入注解

@Data

public class UserModel implements Serializable {

private String id;

@NotBlank(message = “用户名不能为空”)

private String name;

@NotNull(message = “性别不能不填”)

private Byte gender;

@NotNull(message = “年龄不能不填”)

@Min(value = 0,message = “年龄必须大于0岁”)

@Max(value = 150,message = “年龄必须小于150岁”)

private Integer age;

@NotBlank(message = “手机号不能不填”)

private String telphone;

private String registerMode;

private String thirdPartyId;

private String encrptPassward;

}

方法一:3.controller方法入参加入校验(@Validated )

@GetMapping(“/getUser”)

public String validator(@Validated UserModel userModel , BindingResult result) {

if (result.hasErrors()) {

return result.getFieldError().getDefaultMessage();

}

return “ok”;

}

方法二:3.自定义封装ValidatorImpl类

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
https://i-blog.csdnimg.cn/blog_migrate/af963ef668b4f0ecf71229629c2dce64.jpeg" alt=“img” style=“zoom: 33%;” />

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

[外链图片转存中…(img-GylPZZjJ-1712759884299)]

[外链图片转存中…(img-F0VnKabn-1712759884299)]

[外链图片转存中…(img-wjfQ7hD3-1712759884300)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值