背景
當(dāng)服務(wù)端接口一拿到前臺(tái)的入?yún)ⅲ闶遣皇巧先ゾ烷_始堆積if-else跳座,十多行代碼下去端铛,發(fā)現(xiàn)全判斷校驗(yàn)參數(shù)了,還沒進(jìn)入正常的業(yè)務(wù)邏輯疲眷。雖然功能沒啥毛病禾蚕,但看起來太冗長,被后來者看到狂丝,那是免不了一頓吐槽的换淆!想要優(yōu)雅一點(diǎn)嗎?那就一起隨小編一起來學(xué)習(xí)使用spring-boot-starter-validation進(jìn)行參數(shù)校驗(yàn)几颜!
優(yōu)點(diǎn)
- controller層的代碼看起來干凈整潔
- spring-boot-starter-validation本身內(nèi)置了一些注解可以直接使用倍试,比如@NotNull,@NotBlank蛋哭,@Size等
- 支持自定義注解县习,靈活方便
搭建
pom引入依賴包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
常用注解
@NotNull
@NotBlank
@NotEmpty
@Size
image.png
自定義注解
/**
* 時(shí)間屬性格式校驗(yàn)
* @author:liyajie
* @createTime:2022/1/20 10:38
* @version:1.0
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Constraint(validatedBy = DateValidator.Validator.class)
public @interface DateValidator {
// 校驗(yàn)未通過時(shí)的返回信息
String message() default "日期格式不正確";
// 以下兩行為固定模板
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* 預(yù)期日期格式
*/
String expectValue();
@Slf4j
class Validator implements ConstraintValidator<DateValidator, String> {
private String expectValue;
@Override
public void initialize(DateValidator dateValidator) {
expectValue = dateValidator.expectValue();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
boolean flag = false;
/**
* 為空直接通過,只做格式驗(yàn)證
*/
if(Strings.isNullOrEmpty(value)){
return true;
}
try {
Date date = DateUtil.formatStr2Date(value, expectValue);
flag = true;
}catch (RuntimeException e){
log.warn("DateValidator 日期格式不正確");
e.printStackTrace();
}
return flag;
}
}
}
image.png
測試
image.png
注意點(diǎn)
校驗(yàn)不通過時(shí)谆趾,會(huì)直接拋出異常躁愿,程序?qū)⑼V箞?zhí)行下面的邏輯,這樣是不合理的沪蓬,所以我們要捕獲異常彤钟,并進(jìn)行處理,方案如下:
全局捕獲異常跷叉,并統(tǒng)一返回:
/**
* 全局異常處理
* @author: zhanglei
* @version: 1.0
* @date: 2021/5/18 20:27
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 校驗(yàn)異常
* @author: liyajie
* @date: 2022/1/20 13:07
* @param e
* @return com.lyj.validates.common.R
* @exception:
* @update:
* @updatePerson:
**/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public R exceptionHandler(MethodArgumentNotValidException e) {
log.error("exceptionHandler info:", e);
BindingResult bindingResult = e.getBindingResult();
StringBuilder builder = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
builder.append(fieldError.getDefaultMessage()).append("!");
}
log.error("message : {}",builder.toString());
return new R("500",builder.toString());
}
}
結(jié)束
需要源碼的可以關(guān)注公眾號(hào)【溫故知新之java】逸雹,更多干活與你分享营搅。