1. 程式人生 > >springboot~為Money類型添加最大值和最小值的註解校驗

springboot~為Money類型添加最大值和最小值的註解校驗

status ret 大於 public http money string uil lin

在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.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/

springboot~為Money類型添加最大值和最小值的註解校驗