由于在练习的小商城项目中使用到了JSR303这个知识点,所以记录下使用步骤,以便后来翻阅:
1. 使用前先导入jar包依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2. 导入jar包依赖后给实体entity添加校验注解并添加相应的错误提示信息,具体可以参考:javax.validation.constraints :
以下实体类添加注解:
注意: @ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})是一个自定义注解;groups = {UpdateGroup.class}在后面也会讲解用法
后面我们会讲到。
/**
* 品牌
*
* @author hzz
* @email hzz@gmail.com
* @date 2020-07-21 14:45:41
*/
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
//品牌id
@NotNull(message = "修改必须指定品牌id", groups = {UpdateGroup.class})
@Null(message = "新增不能指定id", groups = {AddGroup.class})
@TableId
private Long brandId;
//品牌名
@NotBlank(message = "品牌名必须提交", groups = {UpdateGroup.class, AddGroup.class})
private String name;
//品牌logo地址
@NotBlank(message = "品牌logo地址不能为空", groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})
private String logo;
//介绍
private String descript;
//显示状态[0-不显示;1-显示]
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
@ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
//@Pattern:自定义校验规则,里面有一个正则表达式
//检索首字母
@NotBlank(message = "检索首字母必须为空", groups = {AddGroup.class})
@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母", groups = {AddGroup.class, UpdateGroup.class})
private String firstLetter;
//排序
@NotNull(groups = {AddGroup.class})
@Min(value = 0, message = "排序必须大于等于0", groups = {AddGroup.class, UpdateGroup.class})
private Integer sort;
}
3. 在控制器中的入参处添加注解@Valid,并且在紧接着的参数添加 BindingResult result来进行异常信息捕获:
@RequestMapping("/save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
Map<String,String> map = new HashMap<>();
//获取校验的错误结果
if(result.hasErrors()){
result.getFieldErrors().forEach((item) ->{
//获取错误的属性的名字
String fieldError = item.getField();
//FieldError 获取到错误提示
String message = item.getDefaultMessage();
map.put(fieldError,message);
});
return R.error(400,"输入数据不符合规则").put("data",map);
}else {
brandService.save(brand);
}
return R.ok();
}
4.在原先的基础上可以使用分组校验:
1) 创建相应分组校验接口,只是个形式,什么都没有:public interface AddGroup { } -----具体什么意思我也不知道
2) 在实体类校验注解中加入groups属性:
@NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class}):修改时必须有id,否则拦截
@Null(message = "新增不能指定id",groups = {AddGroup.class}):新增时必须没有id,否则拦截
3)在请求的入参处加入注解@Validated(AddGroup.class)并设置相应的操作类型:
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand){ }
public R update(@Validated(UpdateGroup.class)@RequestBody BrandEntity brand){ }
4)注意:默认没有指定分组的校验注解@NotBlank,在分组校验情况@Validated({AddGroup.class})
下不生效,只会在@Validated生效;
以上就是后端自定义校验的全部流程,由于博主是个码农新手,只能记录一下书写代码步骤,只为进入下家公司能够快速上手!!!大家有好的建议也可以给我留言谢谢。。。