以下內容純屬個人扯淡,僅供參考
目錄
《Spring實戰》給出的參數校驗方式
參考:《Spring實戰》知識點總結 搜索:表單校驗
大致思路:在需要被校驗的實體類的屬性上添加校驗註解;在POST方法該實體類前添加@Valid註解,並緊隨添加一個Errors errors形參;在該方法體errors.hasErrors()是否校驗通過來控制
使用SpringAOP改進
1、實體類屬性添加校驗註解
@Data
public class PctUserParam {
@NotEmpty(message = "用戶名不能爲空")
private String username;
private String password;
@Email
private String mail;
private Integer status;
/**
* 備註
*/
private String remark;
}
2、控制器方法
@PostMapping("user")
public CommonResult<Boolean> addUser(
@RequestBody @Validated PctUserParam pctUserParam,
BindingResult bindingResult) {
return pctUserService.addUser(pctUserParam);
}
用@Validated替換了@Valid,並且Errors替換爲BindingResult
3、AOP攔截處理
@Aspect
@Component
@Order(2)
@Slf4j
public class BindingResultAspect {
/**
* 定義切入點
*
**/
@Pointcut("execution(public * com.controller.*.*(..))")
public void bindingResult() {
}
/**
* 環繞通知
*
* @date 10:54 2020/3/20
* @author 李文龍
* @param
* @return
**/
@Around("bindingResult()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//獲取方法的所有形參
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
//拿到參數校驗結果形參
if (arg instanceof BindingResult) {
BindingResult result = (BindingResult) arg;
if (result.hasErrors()) { //校驗失敗
FieldError fieldError = result.getFieldError();
if(fieldError!=null){
log.error("fieldError="+fieldError.getDefaultMessage());
return CommonResult.validateFailed(fieldError.getDefaultMessage());
}else{
return CommonResult.validateFailed();
}
}
}
}
//正常執行方法
return joinPoint.proceed();
}
}
使用全局異常處理器實現
將參數校驗層完全抽離
自定義註解
service層參數校驗設計