后端在处理前端传过来的数据时,尽管前端表单已经加了校验逻辑,但是作为严谨考虑,在后端对接口传输的数据做校验也必不可少。

开启校验:

实体类上增加校验注解,接口参数前增加@Valid 开启校验

  1. package com.zsy.product.entity;
  2. import javax.validation.constraints.*;
  3. import org.hibernate.validator.constraints.URL;
  4. /**
  5. * 品牌
  6. *
  7. * @author zsy
  8. * @email 594983498@qq.com
  9. * @date 2019-10-01 21:08:49
  10. */
  11. @Data
  12. @TableName("pms_brand")
  13. public class BrandEntity implements Serializable {
  14. private static final long serialVersionUID = 1L;
  15. /**
  16. * 品牌id
  17. */
  18. @NotNull(message = "修改必须指定品牌id", groups = {UpdateGroup.class})
  19. @Null(message = "新增不能指定id", groups = {AddGroup.class})
  20. @TableId
  21. private Long brandId;
  22. /**
  23. * 品牌名
  24. */
  25. @NotBlank(message = "品牌名必须提交", groups = {AddGroup.class, UpdateGroup.class})
  26. private String name;
  27. /**
  28. * 品牌logo地址
  29. */
  30. @NotBlank(groups = {AddGroup.class})
  31. @URL(message = "logo必须是一个合法的url地址", groups = {AddGroup.class, UpdateGroup.class})
  32. private String logo;
  33. /**
  34. * 介绍
  35. */
  36. private String descript;
  37. /**
  38. * 显示状态[0-不显示;1-显示]
  39. */
  40. // @Pattern()
  41. @NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
  42. @ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateStatusGroup.class})
  43. private Integer showStatus;
  44. /**
  45. * 检索首字母
  46. */
  47. @NotEmpty(groups = {AddGroup.class})
  48. @Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母", groups = {AddGroup.class, UpdateGroup.class})
  49. private String firstLetter;
  50. /**
  51. * 排序
  52. */
  53. @NotNull(groups = {AddGroup.class})
  54. @Min(value = 0, message = "排序必须大于等于0", groups = {AddGroup.class, UpdateGroup.class})
  55. private Integer sort;
  56. }
  1. @RequestMapping("/save")
  2. //@RequiresPermissions("product:brand:save")
  3. public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand/*,BindingResult result*/) {
  4. brandService.save(brand);
  5. return R.ok();
  6. }

JSR303
1)、给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示
2)、开启校验功能@Valid
效果:校验错误以后会有默认的响应;
3)、给校验的参数bean后紧跟一个BindingResult,就可以获取到校验的结果
4)、分组校验(多场景的复杂校验)
1)、 @NotBlank(message = “品牌名必须提交”,groups = {AddGroup.class,UpdateGroup.class})
给校验注解标注什么情况需要进行校验
2)、@Validated({AddGroup.class})
3)、默认没有指定分组的校验注解@NotBlank,在分组校验情况@Validated({AddGroup.class})下不生效,只会在@Validated生效;
5)、自定义校验
1)、编写一个自定义的校验注解
2)、编写一个自定义的校验器 ConstraintValidator
3)、关联自定义的校验器和自定义的校验注解

自定义校验器和校验注解

自定义校验注解

  1. /**
  2. * 自定义校验注解 声明可以取那些值
  3. * @author ZSY
  4. */
  5. @Documented
  6. @Constraint(validatedBy = {ListValueConstraintValidator.class})
  7. @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
  8. @Retention(RUNTIME)
  9. public @interface ListValue {
  10. String message() default "{com.zsy.common.valid.ListValue.message}";
  11. Class<?>[] groups() default {};
  12. Class<? extends Payload>[] payload() default {};
  13. int[] values() default {};
  14. }

自定义校验器

  1. package com.zsy.common.valid;
  2. /**
  3. * @author ZSY
  4. */
  5. public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
  6. private final Set<Integer> set = new HashSet<>();
  7. /**
  8. * 初始化方法
  9. * 参数:自定义注解的详细信息
  10. */
  11. @Override
  12. public void initialize(ListValue constraintAnnotation) {
  13. int[] values = constraintAnnotation.values();
  14. for (int val : values) {
  15. set.add(val);
  16. }
  17. }
  18. /**
  19. * 判断是否校验成功
  20. *
  21. * @param value 需要校验的值
  22. * @param context
  23. * @return
  24. */
  25. @Override
  26. public boolean isValid(Integer value, ConstraintValidatorContext context) {
  27. return set.contains(value);
  28. }
  29. }

创建校验信息提示配置文件
在resource文件下创建:ValidationMessages.properties

  1. com.zsy.common.valid.ListValue.message=必须提交指定的值