SpringBoot Map參數校驗 自定義異常返回自定義JSON錯誤

最近一直在做前後端分離的項目,前端提交的參數很多,用Bean來接前端還要寫每個Bean的前綴,索性就直接傳參了。我們在controller用一個Map接參。

我看網上很少關於Map接參校驗的,我就直接貼代碼了。

1、首先是自定義一個異常類

package com.test.validator.exception;

/**
 * @author MrWang
 * @version v1.0
 * @date 2019/02/20
 * @Description
 * 自定義異常
 */
public class TestException extends RuntimeException{
    private String code;
    private String msg;
    private Object data;

    public TestException(String code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getData() {
        return data;
    }
}

首先這個類必須繼承RuntimeException,其次定義你想往前端返回的統一格式。生成構造函數和getset方法。

2、創建全局捕捉異常類

package com.test.validator.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @author MrWang
 * @version v1.0
 * @date 2019/02/20
 * @Description
 * 全局捕捉異常處理類
 * @ControllerAdvice註解可以加參數basePackages:指定捕捉異常的包範圍
 */
@ControllerAdvice
public class TestControllerAdvice {
    /**
     * 自定義異常處理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = TestException.class)
    public Map myErrorHandler(TestException ex) {
        Map map = new HashMap(3);
        map.put("code", ex.getCode());
        map.put("message", ex.getMsg());
        map.put("data",ex.getData());
        return map;
    }
}

這個類的作用就是捕捉全局異常 然後向前端返回錯誤信息。

3、自定義校驗工具類

package com.test.validator.common;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.test.validator.exception.TestException;

/**
 * @author MrWang
 * @version v1.0
 * @date 2019/02/20
 * @Description
 * 自定義校驗工具類
 */
public class FieldUtils {

    /**
     * 字符串非空校驗
     * @param filed 要校驗的字段
     * @param message message
     * @param code code
     * @param data data
     */
    public static void stringIsNullCheck(String filed,String message,String code,Object data){
        if (StrUtil.isBlank(filed)){
            throw new TestException(code,message,data);
        }
    }

    /**
     * 數字校驗
     * @param filed 要校驗的字段
     * @param message message
     * @param code code
     * @param data data
     */
    public static void isNumberCheck(String filed,String message,String code,Object data){
        if (!NumberUtil.isNumber(filed)){
            throw new TestException(code,message,data);
        }
    }

    /**
     * 整數校驗
     * @param filed 要校驗的字段
     * @param message message
     * @param code code
     * @param data data
     */
    public static void isIntCheck(String filed,String message,String code,Object data){
        if (!NumberUtil.isInteger(filed)){
            throw new TestException(code,message,data);
        }
    }

    /**
     * 郵件校驗
     * @param filed 要校驗的字段
     * @param message message
     * @param code code
     * @param data data
     */
    public static void isEmailCheck(String filed,String message,String code,Object data){
        if (!Validator.isEmail(filed)){
            throw new TestException(code,message,data);
        }
    }

    /**
     * 手機號校驗
     * @param filed 要校驗的字段
     * @param message message
     * @param code code
     * @param data data
     */
    public static void isMobileCheck(String filed,String message,String code,Object data){
        if (!Validator.isMobile(filed)){
            throw new TestException(code,message,data);
        }
    }
}

因爲是一個測試的小demo,所以就寫了幾個校驗,可以模仿以上的寫法往上加。

5、校驗層代碼

package com.test.validator.service.impl;

import com.test.validator.common.FieldUtils;
import com.test.validator.service.TestService;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author MrWang
 * @version v1.0
 * @date 2019/02/20
 * @Description
 */
@Service
public class TestServiceImpl implements TestService {
    private static final String CODE = "Y50000";

    @Override
    public Map post(Map<String,String> record) {
        FieldUtils.stringIsNullCheck(record.get("username"),"用戶名不能爲空",CODE,"");
        FieldUtils.stringIsNullCheck(record.get("password"),"密碼不能爲空",CODE,"");
        FieldUtils.stringIsNullCheck(record.get("sex"),"性別不能爲空",CODE,"");
        FieldUtils.isNumberCheck(record.get("age"),"輸入的年齡不合法",CODE,"");
        FieldUtils.isIntCheck(record.get("age2"),"請輸入整數",CODE,"");
        FieldUtils.isEmailCheck(record.get("email"),"請輸入正確的郵件",CODE,"");
        FieldUtils.isMobileCheck(record.get("mobile"),"請輸入正確的手機號",CODE,"");
        //dao邏輯操作
        return record;
    }
}

我們一般都是在service層進行字段校驗,可見我們從Map中取出參數後挨個校驗參數,如有異常,直接拋掉。是不是比以前的校驗清晰多了。

6、實踐

我們使用postman對這些參數進行測試校驗

 

工具類使用的hutool特別好用,給大家安利一下。這是官網

源碼地址

GitHub:https://github.com/chuanzige/springboot_validator

碼雲:https://gitee.com/QingJiaoWoChuanZiGe/springboot_validator

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