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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM