1.引入
由于前端傳參常常需要校驗,比如郵箱的格式,于是誕生JSR303規則;
2.使用
能使用的校驗注解:
1.Hibernate org.hibernate.validator.constrains 裡面有的
2.Jsr303規定的 javax.validation.constraints
@pattern(regexp="")正規表達式
步驟:
1.javabean上注解
Class User{
@Email(message ="郵箱格式不正确")
private String email;
@NotBlank
@Length(min=6,max=18,message="使用者名長度必須6-18位")
private String username;
}
2.告訴springboot這個需要校驗@Valid
@PostMapping("/user")
public String ControllerTest(@Valid @RequestBody User user){
//1.如果不滿足校驗,會抛出異常;但項目規範有自定義異常,而自動抛出的異常不符合前端處理規範。
}
@PostMapping("/user")
public String ControllerTest(@Valid @RequestBody User user,BindingResult res){
//2.後面綁定後則不再抛出異常,而是把結果存在res,程式正常執行
int errorCount = res.getErrorCount();//擷取錯誤個數
if(errorCount >0){
List<FieldError> fieldErrors = res.getFieldErrors();
fieldErrors.forEach((fieldError)->{
String field = fieldError.getField();//屬性
fieldError.getRejectedValue;//擷取出錯的值
fieldError.getDefaultMessage();//擷取提示消息
});
return new Response().Failed(res);
}else{
}
}
3.由于每個controller都需要校驗,為了統一校驗,利用aop來實作Jsr303
通知:
前置通知:方法執行之前觸發
後置通知:方法執行之後觸發
傳回通知:方法正常傳回之後觸發
異常通知:方法出現異常觸發
正常執行: 前置通知==>傳回通知==>後置通知
異常執行: 前置通知==>異常通知==>後置通知
環繞通知:4合一
//1.springboot引入aop的包
//1.切面 2.切入點 3.切入點表達式(* com.jd.mall.admin..*Controller.*(..))任意傳回值,admin包下的.任意包,Controller結尾的任意類,*任意方法的(..)任意參數
@Aspect
@Component
public class DataVaildAspect{
//環繞通知
@Around("execution(* com.jd.mall.admin..*Controller.*(..))")
public Object validAround(ProceedingJoinPoint point){
Object proceed = null;
try{
Object[] args = point.getArgs();
for(Object obj:args){
if(obj instanceof BindingResult){
BindingResult r = (BindingResult) obj;
if(r.getErrorCount()>0){
return new Response().Failed(r);
}
}
}
log.debug("前置通知。。。");
proceed = point.proceed(point.getArgs());//執行目标方法
log.debug("傳回通知。。。");
}catch(){
log.debug("異常通知。。。");
}finally{
log.debug("後置通知。。。");
}
return proceed;//正常controller傳回值
}
}