Java请求参数校验 Validation API使用

Java开发中经常需要对请求接口的参数进行校验,本文记录了实际开发中的常用校验方法及场景

实际开发中主要借助Javax Validation 注解(hibernate-validator库) 及Spring Validation API

  • 引入依赖
<dependency>
    <groupId>org.hibernategroupId>
    <artifactId>hibernate-validatorartifactId>
    <version>6.1.0.Finalversion>
dependency>
  • 具体使用
    比如,有如下DTO:
@Getter
@Setter
@ToString
public class MemberInfoInquiryRequestDTO {

    @Pattern(regexp = "[\\d]{12}", message = "memberId invalid")
    private String memberId;

    @Pattern(regexp = ".{3,64}", message = "memberName invalid")
    private String memberName;

    @PastOrPresent
    private Date beginDate;

    @NotNull
    private Date endDate;
}

校验工具类如下(借助Spring Validation API):

org.springframework.validation.SmartValidator
org.springframework.validation.DirectFieldBindingResult

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JavaValidatorUtil {

    private static final Logger LOG = LoggerFactory.getLogger(JavaValidatorUtil.class);

    public static void validateObject(Object request, SmartValidator smartValidator) {

        if (Objects.isNull(request)) {
            LOG.warn("request is null");
            return;
        }

        DirectFieldBindingResult bindingResult = new DirectFieldBindingResult(request, request.getClass().getSimpleName());
        try {
            smartValidator.validate(request, bindingResult);
        } catch (Exception e) {
            LOG.error(e.getMessage());
            throw new RuntimeException("校验异常" + e.getMessage());
        }

        if (bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();

            // 返回所有的invalid信息
            List<String> errorMsgList = errors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.toList());
            LOG.error(Arrays.toString(errorMsgList.toArray()));

            throw new RuntimeException("Invalid argument: " + Arrays.toString(errorMsgList.toArray()));
        }
    }
}

测试如下:
Java请求参数校验 Validation API使用_第1张图片
校验信息:

Invalid argument: [memberName invalid, memberId invalid]


Javax validation 注解说明

@Getter
@Setter
@ToString
public class FooDTO {

    // 非null时校验 只能用于Boolean类型
    @AssertFalse(message = "foo 必须为false")
    private Boolean foo;
    // 非null时校验 只能用于Boolean类型
    @AssertTrue(message = "foo2 必须为true")
    private Boolean foo2;

    // 非null时校验
    @DecimalMax(value = "100.55", message = "foo3大于最大值")
    @DecimalMin(value = "50.00", message = "foo3 小于最小值")
    private BigDecimal foo3; // foo3必须非空且 50.00 =< foo3 <= 100.55
    // 非null时校验
    @DecimalMax(value = "100.55", message = "foo3Foo3大于最大值")
    @DecimalMin(value = "50.00", message = "foo3Foo3 小于最小值")
    private String foo3Foo3; // foo3Foo3必须非空且 50.00 =< foo3Foo3 <= 100.55

    // 非null时校验
    @Digits(integer = 3, fraction = 2, message = "foo4 格式不合法")
    private String foo4;
    // 非null时校验
    @Digits(integer = 3, fraction = 2, message = "foo4Foo4 格式不合法")
    private BigDecimal foo4Foo4;

    // 非null时校验
    @Future(message = "foo5必须大于当前日期")
    private Date foo5;
    // 非null时校验
    @FutureOrPresent(message = "foo6必须大于或等于当前日期")
    private Date foo6;

    // 非null时校验
    @Past(message = "foo7必须小于当前日期")
    private Date foo7;
    // 非null时校验
    @PastOrPresent(message = "foo8必须小于或等于当前日期")
    private Date foo8;

    // 非null时校验
    @Max(value = 100000000L, message = "foo9大于限定的最大值")
    @Min(value = 1000, message = "foo9小于限定的最小值")
    private String foo9;
    // 非null时校验
    @Max(value = 100000000L, message = "foo9Foo9大于限定的最大值")
    @Min(value = 1000, message = "foo9Foo9小于限定的最小值")
    private Integer foo9Foo9;

    // 非null时校验
    @Negative(message = "foo22必须是小于零的数字")
    private Long foo22;
    // 非null时校验
    @NegativeOrZero(message = "foo33必须是小于或等于零的数字")
    private Long foo33;

    // 非null时校验
    @Positive(message = "foo44必须是大于零的数字")
    private Integer foo44;
    // 非null时校验
    @PositiveOrZero(message = "foo55必须是大于或等于零的数字")
    private Integer foo55;

    @NotBlank(message = "foo66不允许为[null/空字符串/空格]")
    private String foo66;

    @NotEmpty(message = "foo77不允许为[null/空字符串]")
    private String foo77;
    @NotEmpty
    private List<String> fooList;

    @NotNull(message = "foo88不允许为空")
    private String foo88;
    @Null(message = "foo99必须为空")
    private String foo99;

    // 非null时校验
    // 1 =< foo222的长度 <= 6
    @Size(min = 1, max = 6)
    private String foo222;
    // 非null时校验
    // 1 =< fooList2的元素个数 <= 2
    @Size(min = 1, max = 2)
    private List<String> fooList2;

    // 非null时校验
    @Pattern(regexp = ".*", message = "foo333格式不合法")
    private String foo333;

    /**
     * 非null时校验
     * 当BarDTO非空时 校验其属性
     */
    @Valid
    private BarDTO barDTO;

}
@Getter
@Setter
@ToString
public class BarDTO {

    @NotEmpty
    private String bar;

}

@Pattern常用正则

你可能感兴趣的:(Java开发者常用实践,Java,java)