前言:后端编写接口,供前端调用,前端已将表单进行验证(判空),后端也要对接收的数据进行验证(是否可以为空)
1:编写公共类
首先编写方法:此方法需要传递2个参数,第一的参数是一个对象(此对象储存前端传递的数据),第二个参数是此接口必填的字段名(多个逗号分隔),进方法后先执行model_isNoll()方法,先看下此方法!下方
/**
* 验证是否含有全部必填字段
* classModel 实体类 ,requiredColumns为必须要传的字段
*
* @param requiredColumns 必填的参数字段名称 逗号隔开 比如"userId,name,telephone"
*/
public static void hasAllRequired(Object classModel, String requiredColumns) {
Map<String, Object> map = model_isNoll(classModel);
if (!FormatEmpty.isEmpty(requiredColumns)) {
//验证字段非空
String[] columns = requiredColumns.split(",");
for (String column : columns) {
if (map.containsKey(column.trim())) {
if(FormatEmpty.isEmpty(map.get(column))){
throw new ApiException(column+" 值不能为空");
}
}
}
} else {
throw new ApiException("判空的字段不能为空");
}
}
下3方法主要是利用反射机制获取传入对象的属性名,然后通过属性名获取属性值,最后将对应的属性名及属性值放在map中
/**
* 把当前实体类的属性及值放在map中
*/
public static Map<String, Object> model_isNoll(Object classModel) {
String[] fieldNames = getFiledName(classModel);
Map<String, Object> companyWantMap = new HashMap<>();
for (int j = 0; j < fieldNames.length; j++) { //遍历所有属性
String name = fieldNames[j]; //获取属性的名字
Object value = getFieldValueByName(name, classModel);
if (value == null) {
value = "";
}
companyWantMap.put(name, value);
}
return companyWantMap;
}
/**
* 获取属性名数组
*/
private static String[] getFiledName(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/**
* 根据属性名获取属性值
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[]{});
Object value = method.invoke(o, new Object[]{});
return value;
} catch (Exception e) {
return null;
}
}
现在回到第一个方法,可以看到,通过后3方法可以获取对象中对应的属性名及属性值;遍历不能为空的字段,通过containskey()查找map对应的key值,假设找到对应的key时,判断value是否为空,空时给与异常反馈
public class ApiException extends RuntimeException
{
private static final long serialVersionUID = 1L;
protected final String message;
public ApiException(String message)
{
this.message = message;
}
public ApiException(String message, Throwable e)
{
super(message, e);
this.message = message;
}
@Override
public String getMessage()
{
return message;
}
}
2:调用
@PostMapping("/adds")
@ResponseBody
public void adds(Bxy_Classification model) {
Model_IsUtil.hasAllRequired(model,"name");
bxy_ClassificationService.insertBxy_Classification(model);
}
调用hasAllRequired()方法,假设未传递name值时的异常提示
{ "msg":"name 值不能为空", "code":4001 }
参考:https://blog.csdn.net/weixin_43844810/article/details/90762425