Java项目传参时,可能有许多字段都需要进行校验,可以通过javax.validation.constraints.*包下的注解,再配合@Valid和BindingResult进行错误信息的返回。如下:
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<FieldError> 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 被注释的元素必须是一个未来的日期