Java开发中经常需要对请求接口的参数进行校验,本文记录了实际开发中的常用校验方法及场景
实际开发中主要借助Javax Validation 注解(hibernate-validator库) 及Spring Validation API
- 引入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</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()));
}
}
}
测试如下:
校验信息:
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常用正则