zoukankan      html  css  js  c++  java
  • springboot~为Money类型添加最大值和最小值的注解校验

    在spring框架里,为我们集成了很多校验注解,直接在字段上添加对应的注解即可,这些注解基本都是简单保留类型的,即int,long,float,double,String等,而如果你自己封装了新的类,那么如果要校验它,注解这块需要自己写一下,像money这个类型,如果希望对它进行校验,注解这块需要自己去写。

    普通类型的注解校验

     /**
       * 编号.
       */
      @NotBlank(message = "部门编号不能为空。")
      private String code;
    
      /**
       * 名称.
       */
      @NotBlank(message = "部门名称不能为空。")
      private String name;

    自定义的注解校验

    一 注解类

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    /**
     * 最小值约束.
     */
    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = MinMoneyHandle.class)
    public @interface MinMoney {
      /**
       * message.
       *
       * @return
       */
      String message() default "{minMoney.message.error}";
    
      /**
       * min value.
       *
       * @return
       */
      double value() default 0;
    
      /**
       * group.
       *
       * @return
       */
      Class<?>[] groups() default {};
    
      /**
       * payload.
       *
       * @return
       */
      Class<? extends Payload>[] payload() default {};
    }

    二 处理类

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import org.javamoney.moneta.Money;
    
    /**
     * min handle.
     */
    public class MinMoneyHandle implements ConstraintValidator<MinMoney, Money> {
      MinMoney constraint;
    
      public void initialize(MinMoney constraint) {
        this.constraint = constraint;
      }
    
      /**
       * valid.
       *
       * @param value   .
       * @param context .
       * @return
       */
      public boolean isValid(Money value, ConstraintValidatorContext context) {
        return value != null && value.getNumber().doubleValue() >= constraint.value();
      }
    
    }

    三 使用,直接在实体上添加对应的注解即可,注解里的字段有自己的默认值,程序员也可以显示为他们赋值

    @Builder
    @Getter
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserInfo {
      private String name;
      private String email;
      @MinMoney(value = 0, message = "金额不能小于0.")
      @MaxMoney(value = 10, message = "金额不能大于10.")
      private Money price;
    
    }

    然后通过WebClientTest进行测试即可

    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    public class ValidateTest {
      @Autowired
      WebTestClient webTestClient;
    
      @Test
      public void test() {
        UserInfo entity = UserInfo.builder()
            .price(Money.of(100, "CNY"))
            .build();
        val obj = webTestClient.post()
            .uri("/add")
            .body(BodyInserters.fromObject(entity))
            .exchange()
            .expectStatus().isEqualTo(400)
            .expectBody();
    
      }
    }

    感谢各位的阅读!

    今天自己写出了这个注解,感谢很有成就,哈哈!

    参考文章:http://dolszewski.com/spring/custom-validation-annotation-in-spring/

  • 相关阅读:
    数据类型之集合 set &运算关系
    python数据类型之字典类型-dict
    python数据类型之元组类型tuple
    python数据类型之列表类型-list
    python数据类型之字符串类型str
    python之if判断、while循环、for循环
    数据的类型、用户交互、格式化输出、基本运算符简介
    什么是操作系统,汇编语言的分类简介,以及python
    1 Kubernetes管理之master和Node
    python学习第三天 -----2019年4月23日
  • 原文地址:https://www.cnblogs.com/lori/p/9021681.html
Copyright © 2011-2022 走看看