springboot~為(wei)Money類(lei)型(xing)添(tian)加最(zui)大值(zhi)和最(zui)小值(zhi)的注解校驗
在spring框架里,為(wei)我們(men)集成了很多校驗注(zhu)解(jie),直(zhi)接在字段上(shang)添加對應的(de)注(zhu)解(jie)即(ji)可,這些(xie)注(zhu)解(jie)基(ji)本都是(shi)簡單保留類型的(de),即(ji)int,long,float,double,String等,而如果(guo)你自己(ji)封裝了新的(de)類,那么如果(guo)要(yao)校驗它(ta),注(zhu)解(jie)這塊需(xu)要(yao)自己(ji)寫一下,像money這個類型,如果(guo)希望對它(ta)進行(xing)校驗,注(zhu)解(jie)這塊需(xu)要(yao)自己(ji)去(qu)寫。
普通類型(xing)的(de)注解(jie)校驗
/** * 編號. */ @NotBlank(message = "部門編號不能為空。") private String code; /** * 名稱. */ @NotBlank(message = "部門名稱不能為空。") private String name;
自定(ding)義的(de)注解校驗
一 注解類
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; /** * 最(zui)小值約束. */ @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(); } }
三 使用,直接(jie)在實體(ti)上添加對應(ying)的注(zhu)(zhu)解即可,注(zhu)(zhu)解里的字段有(you)自己的默認值(zhi),程序員(yuan)也可以(yi)顯示為他們(men)賦值(zhi)
@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(); } }
感謝各位的閱讀!
今(jin)天自己(ji)寫出了(le)這個注解,感謝(xie)很(hen)有成就,哈哈!
參考文章: