JSR303校验
JSR303 数据效验
前端数据效验成功了,就会把json数据传递到后端,但是有人利用接口 比如 postman 乱发送请求 那会怎么办,于是后端也会利用 JSR303进行数据效验
-
在实体类中添加注解
@NotEmpty(messsage = "logo不能为空") @URL(message = "logo必须是一个合法的url地址") private String logo;
-
开启效验功能 @Valid
@RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); }
-
BindingResult 就可以获取到效验的结果
public R save(@Valid @RequestBody BrandEntity brand,BindingResult result){ if(result.hasErrors()){ Map<String,String> map = new HashMap<>(); //1、获取校验的错误结果 result.getFieldErrors().forEach((item)->{ //FieldError 获取到错误提示 String message = item.getDefaultMessage(); //获取错误的属性的名字 String field = item.getField(); map.put(field,message); }); return R.error(400,"提交的数据不合法").put("data",map); }else { }
9.3、分组校验
-
创建两个接口,标识作用
public interface AddGroup { } public interface UpdateGroup { }
-
在实体类中添加注解groups
/** * 品牌id */ @Null(message = "新增不能指定Id",groups = {AddGroup.class}) @NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class}) @TableId private Long brandId; /** * 品牌名 */ @NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class}) private String name; /** * 品牌logo地址 */ @NotEmpty(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; /** * 检索首字母 */ @NotEmpty(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;
-
方法添加注解@Validated()
// 标记使用修改分组 public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){ brandService.updateById(brand); return R.ok(); }
9.4、自定义校验
-
编写自定义校验注解
@Documented @Constraint(validatedBy = {ListValueConstraintValidator.class})//指定自定义的校验器 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) public @interface ListValue { / /com.atguigu.common.valid.ListValue当前注解的路径,提示错误的信息 String message() default "{com.atguigu.common.valid.ListValue.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] vals() default{ }; }
-
编写一个自定义的校验器
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> { private Set<Integer> set = new HashSet<>(); @Override public void initialize(ListValue constraintAnnotation) { int[] vals = constraintAnnotation.vals(); for(int val:vals){ set.add(val); } } @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return set.contains(value); } }
-
编写ValidationMessages.properties提示错误信息
com.atguigu.common.valid.ListValue.message=必须提交指定的值
-
示例
/** * 显示状态[0-不显示;1-显示] */ @ListValue(value = {0,1},groups ={AddGroup.class}) private Integer showStatus;