spring校驗必填字段

 

使用切面實現

/**
 * @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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章