使用切面實現
/**
* @Auther: liyongli
* @Date: 2019/9/20 14:43
* @Description:
*/
@Slf4j
@Aspect
@Component
@Order(3)
public class ParamValidAspect {
/**
* 定義切入點
*/
@Pointcut("execution(public * com.sunlands.datacenter.framework.web.controller..*(..))")
public void paramValidService() {
}
/**
* 在切入點開始處切入內容
*
* @param joinPoint
*/
@Around("paramValidService()")
public ResBaseDTO<Object> around(ProceedingJoinPoint joinPoint) {
ResBaseDTO<Object> res = new ResBaseDTO<>();
res.setSuccess();
// 獲取所有的請求參數
Object[] args = joinPoint.getArgs();
if (null != args && args.length > 0) {
for (Object obj : args) {
if (obj instanceof BindingResult) {
// 參數驗證
res = validate((BindingResult) obj);
break;
}
}
}
// 驗證通過執行攔截方法,否則不執行
if (res.isSuccess()) {
try {
// 執行攔截方法
joinPoint.proceed();
} catch (Throwable ex) {
log.error("AOP執行攔截方法時異常, {}", ex);
res.setError("AOP執行攔截方法時異常!" + ex.getMessage());
}
}
return res;
}
/**
* 驗證
*
* @param bindingResult
* @return
*/
private ResBaseDTO<Object> validate(BindingResult bindingResult) {
ResBaseDTO<Object> res = new ResBaseDTO<>();
// 參數驗證結果
if (bindingResult.hasErrors()){
res = new ResBaseDTO<>();
res.setError(bindingResult.getFieldError().getDefaultMessage());
return res;
}
res.setSuccess();
return res;
}
}
controller實現 添加@Validated ,並增加接錯誤的實體類 BindingResult
@RequestMapping(path = "/process",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
@ResponseBody
public ResBaseDTO<Object> process(@Validated @RequestBody ReqDataAccessDTO reqDataAccessDTO,BindingResult bindingResult) {
log.info("process method request param is: {}", JSONObject.toJSON(reqDataAccessDTO));
ResBaseDTO<Object> res;
res = dataAccessService.process(reqDataAccessDTO);
if (res.isError()) {
log.error("數據接入!入參是:{}", JSONObject.toJSONString(reqDataAccessDTO));
return res;
}
res = dataAccessService.saveDataToDb(reqDataAccessDTO);
if (res.isError()) {
log.error("數據入庫失敗!入參是:{}", JSONObject.toJSONString(reqDataAccessDTO));
return res;
}
return res;
}
bean定義,增加相應的校驗標籤
public class ReqDataAccessDTO{
private String sql;
/**
* 存儲介質,必填
*/
@NotEmpty(message = "存儲介質必填")
private String storageMedium;
/**
* 寬表名,必填
*/
@NotEmpty(message = "寬表名稱必填")
private String wideTableName;
}
更詳細請參考https://blog.csdn.net/zlj1217/article/details/81841004