Spring @Valid的两种用法

首先
限制 说明

@Null	限制只能为null
@NotNull	限制必须不为null
@AssertFalse	限制必须为false
@AssertTrue	限制必须为true
@DecimalMax(value)	限制必须为一个不大于指定值的数字
@DecimalMin(value)	限制必须为一个不小于指定值的数字
@Digits(integer,fraction)	限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future	限制必须是一个将来的日期
@Max(value)	限制必须为一个不大于指定值的数字
@Min(value)	限制必须为一个不小于指定值的数字
@Past	限制必须是一个过去的日期
@Pattern(value)	限制必须符合指定的正则表达式
@Size(max,min)	限制字符长度必须在min到max之间
@Past	验证注解的元素值(日期类型)比当前时间早
@NotEmpty	验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank	验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email	验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

对应得实体类假设为



public class AAA  {

    @Pattern(
            regexp = "^(Draft|Active|Inactive)$",
            message = "Please input valid action, only Draft|Active|Inactive " + "is allowed")
    private String action;

    @Pattern(regexp = "^.{0,100}$", message = "Product name only allows 1-100 characters")
    private String productName;

    @Pattern(regexp = "^.{0,500}$", message = "Product description only allows 1-500 characters")
    private String description;

  
    private String startDate;

   
    private String endDate;

    @Pattern(
            regexp = "^(Day|Week|Month|Year)$",
            message = "Please input valid termUnit, only Day|Week|Month|Year is " + "allowed")
    private String termUnit;

    @Pattern(regexp = "(\\d)?", message = "Please input valid termValue, termValue only allows 1 digits")
    private String termValue;

    @Pattern(
            regexp = "^(\\d){0,18}$",
            message = "Please input valid counterLimit, counterLimit only allows 1-18 " + "digits")
    private String counterLimit;

    @Pattern(regexp = "^(\\d){0,18}$", message = "Please input valid minLimit, minLimit only allows 1-18 digits")
    private String minLimit;

    @Pattern(regexp = "^(\\d){0,18}$", message = "Please input valid maxLimit, maxLimit only allows 1-18 digits")
    private String maxLimit;

    @Pattern(
            regexp = "^(Day|Week|Month|Year|Times)$",
            message = "Please input valid rolloverPeriodUnit, only " + "Day|Week|Month|Year|Times is allowed")
    private String rolloverPeriodUnit;

    @Pattern(
            regexp = "^(\\d){0,3}$",
            message = "Please input valid rolloverPeriodValue, rolloverPeriodValue only " + "allows 1-3 digits")
    private String rolloverPeriodValue;

    @Pattern(
            regexp = "^(\\d){0,3}$",
            message = "Please input valid maxNumberOfRollover, rolloverPeriodValue only " + "allows 1-3 digits")
    private String maxNumberOfRollover;

    @Pattern(
            regexp = "^(.){0,18}$",
            message = "Please input valid fundsLenderId, fundsLenderId only allows 1-18 " + "characters")
    private String fundsLenderId;

    @Pattern(
            regexp = "^(\\d){0,3}$",
            message = "Please input valid daysToWatch, daysToWatch only allows 1-3 " + "digits")
    private String daysToWatch;

    @Pattern(regexp = "^(\\d){0,3}$", message = "Please input valid daysToLost, daysToLost only allows 1-3 digits")
    private String daysToSubstandard;

    @Pattern(regexp = "^(\\d){0,3}$", message = "Please input valid daysToLost, daysToLost only allows 1-3 digits")
    private String daysToLost;

    @Pattern(regexp = "^(\\d){0,3}$", message = "Please input valid daysToBad, daysToBad only allows 1-3 digits")
    private String daysToBad;

    private String loanType;


    @Pattern(regexp = "^(1000|5000)$", message = "Please input valid availableIdentityType, only 1000|5000 is allowed")
    private String availableIdentityType;

    @Pattern(
            regexp = "^(.){0,10}$",
            message =
                    "Please input valid currencyInMultiplesOf, currencyInMultiplesOf only allows 1-10 " + "characters")
    private String currencyInMultiplesOf;

    @Pattern(regexp = "^(.){0,10}$", message = "Please input valid strategyId, strategyId only allows 1-10 characters")
    private String strategyId;

    @Pattern(
            regexp = "^(Weekly|Monthly|Maturity)$",
            message = "Please input valid repaymentFrequency, only " + "Weekly|Monthly|Maturity is allowed")
    private String repaymentFrequency;

    @Pattern(
            regexp = "^(\\d){0,3}$",
            message = "Please input valid repaymentDay, repaymentDay only allows 1-3 " + "digits")
    private String repaymentDay;

    @Pattern(regexp = "^(F|G|M|S)$", message = "Please input valid repaymentScheduleType, only F|G|M|S is allowed")
    private String repaymentScheduleType;

    @Pattern(regexp = "^(Y|N)$", message = "Please input valid supportInstallment, only Y|N is allowed")
    private String supportInstallment;

    @Pattern(regexp = "^(Y|N)$", message = "Please input valid supportAutoRepayment, only Y|N is allowed")
    private String supportAutoRepayment;

    @Pattern(regexp = "^(Y|N)$", message = "Please input valid allowRepayInAdvance, only Y|N is allowed")
    private String allowRepayInAdvance;

    @Pattern(
            regexp = "^(\\d){0,3}$",
            message = "Please input valid statementDaysBeforDue, statementDaysBeforDue only allows 1-3" + " digits")
    private String statementDaysBeforDue;

    @Pattern(regexp = "^(Y|N)$", message = "Please input valid autoChangeRiskCategory, only Y|N is allowed")
    private String autoChangeRiskCategory;

  
    @Pattern(regexp = "^(Y|N)$", message = "Please input valid deductAccessFee, only Y|N is allowed")
    private String deductAccessFee;

  
    @Pattern(
            regexp = "^(All|Same|Unlimited)$",
            message = "Please input valid rejectWhenOverdue, only " + "All|Same|Unlimited is allowed")
    private String rejectWhenOverdue;

   
}

第一种一般在controller入口接收参数加上@Valid
如:

  @ApiOperation(value = "/v1/aa", notes = "Modify product info")
    @PostMapping(value = "/v1/aa/{productId}")
    @ResponseBody
    public JsonObject modifyProduct(
            @RequestBody @Valid ModifyProductInfoRequest request,
            @PathVariable(name = "productId") Long productId,
            @org.springframework.web.bind.annotation.RequestHeader(value = "X-Operator-ID", required = false)
                    String operatorID)

如果此时有不满足条件得会报错

第二种:
如果想在业务中来校验,这样方便于记录日志或者错误原因或者做其他操作得话,可以在对应得service中建一个类似如下得空实现方法

service A{
    public void validateRequest(@Valid AAA  requestData) {}
    }
service b{
@Resource
service A a;
   public void doSomeThing( AAA  requestData) {
   .....
  try {
           // 使用正则表达式校验数据格式
           a.validateRequest(requestData);
       } catch (ConstraintViolationException e) {
           Set> constraintViolations = e.getConstraintViolations();
           for (ConstraintViolation violation : constraintViolations) {
               String path = violation.getPropertyPath().toString();
               throw new Exception("xxxxxxxx");
           }
       }
   ....

}
   }

这样来处理,一定要通过对象.方法来调用,类似 a.validateRequest(requestData);否则不会促发触发Spring Validation校验

你可能感兴趣的:(随笔)