1、数据校验
- 前端校验
- 即在页面中使用JS校验表单中用户输入的参数是否合法,如失焦后校验、表单提交时校验…
- 后端校验
- Controller层校验:校验从前端接收到的参数是否合法
- Service层:一般校验业务逻辑,也可校验参数
- Mapper层:一般不校验
写到这里,某天吃饭突然想到关于controller层、Service层、Mapper层数据校验的一个形象比喻:你去面馆吃面,Controller层就像一个点餐自助机器,这里校验的是你想吃的面这里有没有卖的(类比参数合法性校验)。点餐自助机旁的工作人员,会看你扫码支付的钱有没有少给(类比Service层方法,校验业务逻辑)。如果都没有问题,则工作人员将你点的单子传给后厨(类比Mapper层),来做你想吃的面(类比增删改查的mapper方法),而你在自助点餐机上点的"牛肉面、不要香菜、二细"就像一个dto对象,最后端给你一碗面(返回一个调用结果),这个碗,就像是一个和前端约定好的结果抽象类,里面装了牛肉面(类比结果类封装了你查到的数据)
3、@Valid和@Validated
对比项 | @Valid | @Validated |
---|---|---|
提供者 | JSR-303规范 | Spring |
可标注位置 | 方法、方法参数和成员属性(字段)、构造函数 | 方法、方法参数和类型 |
是否支持分组 | 不支持 | 支持 |
是否支持嵌套校验 | 支持 | 不支持 |
共性 | 开启参数校验 | 开启参数校验 |
关于JSR-303的一些介绍在文末.
4、分组校验
当多个接口使用同一个模型类
,如新增课程和修改课程接口,都使用AddCourseDto类,而它们对同一个参数的校验规则不一样,此时就需要分组校验
:
- 定义空接口表示不同的分组
/**
* @description 校验分组
*/
public class ValidationGroups {
public interface Inster{};
public interface Update{};
public interface Delete{};
}
- 定义规则是指定分组, 即加groups属性
@NotEmpty(groups = {ValidationGroups.Inster.class},message = "添加课程名称不能为空")
@NotEmpty(groups = {ValidationGroups.Update.class},message = "修改课程名称不能为空")
// @NotEmpty(message = "课程名称不能为空")
@ApiModelProperty(value = "课程名称", required = true)
private String name;
- 在controller层中启动参数校验时也要指定用哪个分组的规则
...
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Inster.class}) AddCourseDto addCourseDto){
...
注意: 这里想实现这种分组校验的效果, 就只能@Validated
5、嵌套校验
嵌套校验用在要校验的属性是一个实体类属性时:
public classn Person{
@NotBlank
private String name;
@NotEmpty
private List<Pet> petList; //宠物类属性
}
//宠物实体类
public class Pet{
@Min(value = 1)
private Integer age;
@NotBlank
private String name;
}
controller层开启校验:
@GetMapping("/getInfo")
public Object getInfo(@Valid Person person){
...
}
此时: 不管在controller层用@Valid还是@Validated, 都是只校验Person类中的@NotBlank和@NotEmpty, 而宠物属性中的age属性的@Min和name属性的@NotBlank不会被校验
public classn Person{
@NotBlank
private String name;
@Valid //!!!注意这里
@NotEmpty
private List<Pet> petList; //宠物类属性
}
给实体类属性加了@Valid注解, 实体类属性中的属性就会被校验, 而@Validated注解不能用于注解, 此时就只能用@Valid
总结
:
- 你要只是在controller层开启参数校验, 两个用哪个都行
- 要实现分组校验, 只能@Validated
- 要实现嵌套校验, 只能@Valid
7、Java数据校验:JSR-303
最后整理下JSR-303、JSR-349、validation-api、hibernate-validator、Spring之间的关系:
-
SR-303是一项标准、一项规范,JSR-349是其升级版本,添加了一些新特性。它们规定一些校验规范即校验注解如@Null、@NotNull、@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现,说白了就是一堆接口没有实现类,这堆接口放在validation-api.jar中
-
hibernate-validator.jar是对这个规范的实现,并增加了一些其他校验注解,如@Length、@Range等,位于org.hibernate.validator.constraints包下
-
Spring为了给开发者提供便捷,对hibernate-validator.jar进行了二次封装,让数据校验更加便捷、提供了一些新功能
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146063.html