当前位置:   article > 正文

自定义集合类型校验_buildconstraintviolationwithtemplate

buildconstraintviolationwithtemplate

总结⼀下@Validated和@Valid在嵌套验证功能上的区别:
@Validated:在方法参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进⾏嵌套验证。能配合嵌套验证注解
@Valid进⾏嵌套验证。使用@Valid需要配合BindingResult可以直接提供参数验证结果

基于@Validated不能用在属性上或字段上所以不能进行集合嵌套验证及@Valid需要使用BindingResult才能显示验证结果且不能进行分组验证;所以本文通过自定义注解结合@Validated实现集合验证时分组及嵌套验证。

1、自定义一个校验注解类

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8. * 顶一个一个集合中每一个元素校验
  9. */
  10. @Retention(RetentionPolicy.RUNTIME)
  11. /**
  12. *
  13. */
  14. @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
  15. @Constraint(validatedBy = {CollectionValidator.class})//指定使用那些类型进行校验
  16. public @interface CollectionAny {
  17. //定义默认验证消息
  18. String message() default "集合验证不通过";
  19. Class<?>[] groups() default {};
  20. Class<? extends Payload>[] payload() default {};
  21. }

2、自定义一个校验处理类

  1. import com.ruoyi.common.utils.bean.BeanValidators;
  2. import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import javax.validation.ConstraintValidator;
  5. import javax.validation.ConstraintValidatorContext;
  6. import javax.validation.ConstraintViolationException;
  7. import javax.validation.Validator;
  8. import java.util.Collection;
  9. import java.util.Set;
  10. /**
  11. * 定义一个结合校验器
  12. * 第一个参数“CollectionAny”定义校验注解的类
  13. * 第二个参数“Collection”指定要校验的参数类型
  14. */
  15. public class CollectionAnyValidator implements ConstraintValidator<CollectionAny, Collection> {
  16. @Autowired
  17. protected Validator validator;
  18. /**
  19. * 這个方法要返回“true”和“false”
  20. * true:表示验证通过
  21. * false:表示验证不通过,明确返回false的时候才会提示对应配置的消息
  22. *
  23. * @param collection
  24. * @param constraintValidatorContext
  25. * @return
  26. */
  27. @Override
  28. public boolean isValid(Collection collection, ConstraintValidatorContext constraintValidatorContext) {
  29. if (collection == null || collection.size() == 0) {
  30. return true;
  31. }
  32. try {
  33. ConstraintValidatorContextImpl constraintValidatorContext1 = (ConstraintValidatorContextImpl) constraintValidatorContext;
  34. Class<?>[] groupArray = null;
  35. if (constraintValidatorContext1 != null) {
  36. Set<Class<?>> groupSet = constraintValidatorContext1.getConstraintDescriptor().getGroups();
  37. groupArray = groupSet.toArray(new Class<?>[0]);
  38. }
  39. for (Object bean : collection) {
  40. //groupArray 让验证继续传递分组特性
  41. BeanValidators.validateWithException(validator, bean, groupArray);
  42. }
  43. return true;
  44. } catch (ConstraintViolationException ex) {
  45. //禁用默认约束信息
  46. constraintValidatorContext.disableDefaultConstraintViolation();
  47. //将默认信息与具体对象错误信息合并成新的模板
  48. constraintValidatorContext.buildConstraintViolationWithTemplate(String.format("%s[%s]", constraintValidatorContext.getDefaultConstraintMessageTemplate(), ex.getMessage()))
  49. //必须要使用该方法将消息添加到认证器中
  50. .addConstraintViolation();
  51. return false;
  52. }
  53. }
  54. }

3、测试验证实体类

  1. import org.apache.ibatis.annotations.Insert;
  2. import org.apache.ibatis.annotations.Update;
  3. import javax.validation.constraints.NotNull;
  4. public class TestEntity {
  5. @NotNull(message = "nameInsert不能为空", groups = Insert.class)
  6. public String nameInsert;
  7. @NotNull(message = "nameUpdate不能为空", groups = Update.class)
  8. public String nameUpdate;
  9. @NotNull(message = "name不能为空")
  10. public String name;
  11. }

4、测试验证集合类

  1. import com.ruoyi.common.collection.CollectionAny;
  2. import org.apache.ibatis.annotations.Insert;
  3. import org.apache.ibatis.annotations.Update;
  4. import java.util.List;
  5. public class TestEntityColleection {
  6. @CollectionAny(message = "listInsert字段集合验证不通过", groups = Insert.class)
  7. public List<TestEntity> listInsert;
  8. @CollectionAny(message = "listUpdate字段集合验证不通过", groups = Update.class)
  9. public List<TestEntity> listUpdate;
  10. @CollectionAny(message = "字段集合验证不通过")
  11. public List<TestEntity> list;
  12. }

5、验证方法和参数

  1. //{
  2. // "list": [
  3. // {
  4. // "name": "",
  5. // "nameInsert": null,
  6. // "nameUpdate": null
  7. // }
  8. // ],
  9. // "listInsert": [
  10. // {
  11. // "name": null,
  12. // "nameInsert": null,
  13. // "nameUpdate": null
  14. // }
  15. // ],
  16. // "listUpdate": [
  17. // {
  18. // "name": null,
  19. // "nameInsert": null,
  20. // "nameUpdate": null
  21. // }
  22. // ]
  23. //}
  24. @ApiOperation("没有分组")
  25. @PostMapping("/test2")
  26. public AjaxResult test2(@RequestBody @Validated TestEntityColleection testEntity) {
  27. return AjaxResult.success();
  28. }
  29. //{
  30. // "list": [
  31. // {
  32. // "name": null,
  33. // "nameInsert": null,
  34. // "nameUpdate": null
  35. // }
  36. // ],
  37. // "listInsert": [
  38. // {
  39. // "name": null,
  40. // "nameInsert": "",
  41. // "nameUpdate": null
  42. // }
  43. // ],
  44. // "listUpdate": [
  45. // {
  46. // "name": null,
  47. // "nameInsert": null,
  48. // "nameUpdate": null
  49. // }
  50. // ]
  51. //}
  52. @ApiOperation("Update分组")
  53. @PostMapping("/testUpdate")
  54. public AjaxResult testUpdate(@RequestBody @Validated(Update.class) TestEntityColleection testEntity) {
  55. return AjaxResult.success();
  56. }
  57. //{
  58. // "list": [
  59. // {
  60. // "name": null,
  61. // "nameInsert": null,
  62. // "nameUpdate": null
  63. // }
  64. // ],
  65. // "listInsert": [
  66. // {
  67. // "name": null,
  68. // "nameInsert": null,
  69. // "nameUpdate": null
  70. // }
  71. // ],
  72. // "listUpdate": [
  73. // {
  74. // "name": null,
  75. // "nameInsert": null,
  76. // "nameUpdate": ""
  77. // }
  78. // ]
  79. //}
  80. @ApiOperation("Insert分组")
  81. @PostMapping("/testInsert")
  82. public AjaxResult testInsert(@RequestBody @Validated(Insert.class) TestEntityColleection testEntity) {
  83. return AjaxResult.success();
  84. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/310864
推荐阅读
相关标签
  

闽ICP备14008679号