Springboot中使用BindingResult校验字段

Java项目传参时,可能有许多字段都需要进行校验,可以通过javax.validation.constraints.*包下的注解,再配合@ValidBindingResult进行错误信息的返回。如下:

import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;

public class AddTxnReqVO {

    @NotEmpty(message = "'transactionReference' can't be empty!")
    private String transactionReference;
    @NotNull(message = "'paymentAmount' can't be null!")
    @Digits(integer = 19, fraction = 6, message = "'paymentAmount' is out of range!")
    @DecimalMin(value = "0.00", message = "'paymentAmount' is invalid!")
    private BigDecimal paymentAmount;
    @NotEmpty(message = "'email' can't be empty!")
    @Email(regexp = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", message = "'email' is illegal!")
    private String email;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    private LocalDateTime emailDeliveryTime;
    @NotNull(message = "'notificationEmailCount' can't be null!")
    @Range(min = 1, max = 3, message = "'notificationEmailCount' must be between 1 and 3!")
    private Long notificationEmailCount;

    // getter setter 略
}

Controller层通过对标注有@Valid的JavaBean进行校验,并将校验结果封装在BindResult中。

注意:@Valid 和 BindingResult 是一 一对应的,如果有多个@Valid,那么每个@Valid后面都需要跟一个BindingResult用于接收JavaBean的校验信息。

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public BaseResVO add(@RequestBody @Valid AddTxnReqVO requestVO, BindingResult bindingResult) {
        logger.debug("add txn starts------");
        return transactionService.addTxn(requestVO);
    }

下面是定义了一个Aspect去统一处理校验的结果。

@Aspect
@Component
public class ApiValidatorAspect {

    @Around("execution(* com.test.web.controller.TransactionController.*(..)) && args(.., bindingResult)")
    public Object doAround(ProceedingJoinPoint pjp, BindingResult bindingResult) throws Throwable {
        Object result;
        if (bindingResult.hasErrors()) {
            result = fail(bindingResult);
        } else {
            result = pjp.proceed();
        }
        return result;
    }

    private Object fail(BindingResult bindingResult) {
        List errors = bindingResult.getFieldErrors();
        BaseResVO result = new BaseResVO();
        result.setStatus(RequestStatusEnum.FAILURE.getValue());
        ErrorInfoVO errorInfo = new ErrorInfoVO();
        errorInfo.setErrorCode(ErrorCodeEnum.GBG_ERR_101.getCode());
        errorInfo.setErrorMessage(errors.get(0).getDefaultMessage());
        result.setErrorInfo(errorInfo);
        return result;
    }
}

下面列举一些常用的校验注解:

4、常用校验注解

@Null 被注释的元素必须是null
@NotNull 被注释的元素不能为null
@AssertFalse 被注释的元素必须为false
@AssertTrue 被注释的元素必须是true

(字符串/数组/集合)校验:
@Pattern(regexp="reg")  被注释的元素必须符合给定的正则表达式
@Size(max, min)  被注释的元素的长度必须在范围内
@NotEmpty 被注释的元素不为空或者null
@NotBlank 被注释的元素不为null或者trim()后不为空

数值校验:
@Max(value)  被注释的元素必须是一个数字,并且小于或者等于指定的int值
@Min(value)  被注释的元素必须是一个数字,并且大于或等于指定的int值
@DecimalMax(value)  被注释的元素必须是一个数字,并且小于或者等于指定的值 
@DecimalMin(value) 被注释的元素必须是一个数字,并且大于或等于指定的值
@Digits(integer, fraction)  被注释的元素必须是一个数字, 精整数度小于等于integer;小数部分精度小于fraction
@Range(min=long1, max=long2)  被注释的元素必须是一个数字,其值必须>=long1,并且<=long2

日期校验:Date/Calendar
@Post     被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个未来的日期

你可能感兴趣的:(Springboot中使用BindingResult校验字段)