最近一直在做前後端分離的項目,前端提交的參數很多,用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