这段时间封装了很多的sdk,有一些sdk要求请求参数做验证,由于封装sdk肯定是用到第三方的依赖越少越好,所以自己不才写了一个注解的校验,本版本校验没有给出自定一点message,如果要可以自己加上,修改一下即可。下面就说一下这个怎么实现的吧:
一:注解类:
注解类代码如下:
package com.blog.annotation.one;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @author 哲思小辉
* @className CheckNull
* @description 校验参数一个注解
* @createTime 2020年7月30日 16:48:38
*/
@Target({FIELD, ElementType.TYPE, ElementType.PARAMETER})
@Retention(RUNTIME)
public @interface CheckNull {
/**
* 是否校验为null
*
* @return
*/
boolean notNull() default false;
/**
* 默认检查为空
*
* @return
*/
boolean notEmpty() default false;
/**
* 长度最小值,集合最小值,map键最小个数
*
* @return
*/
int minLength() default 0;
/**
* 长度最大值,集合最小值,map键最大个数
*
* @return
*/
int maxLength() default 0;
/**
* 长度固定值
*
* @return
*/
int equalLength() default 0;
/**
* 最小值 (针对基本数据类型)
*
* @return
*/
String minValue() default "";
/**
* 最大值 (针对基本数据类型)
*
* @return
*/
String maxValue() default "";
/**
* 相等的值
*
* @return
*/
String equalValue() default "";
/**
* String包含的数值, Map中必须存在的key
*
* @return
*/
String[] strContains() default {};
/**
* 是否去除前后空格(字符串)
*
* @return
*/
boolean trim() default true;
}
二、校验使用注解的实例对象方法
注解写好了,现在要写它的校验,如何来判断该字段是否符合注解里面定义的呢,下面就是校验的代码:
package com.blog.annotation.one;
import java.lang.reflect.Field;
import java.util.*;
/**
* @author 哲思小辉
* @className CheckNullUtil
* @description 单一注解检测工具
* @createTime 2020年7月30日 16:40:52
*/
public final class CheckNullUtils {
private CheckNullUtils() {
}
private static final String ILLEGAL_STR = "%s值非法";
private static final String ILLEGAL_NULL_OR_EMPTY_STR = "%s为空";
/**
* 长度类错误字符串
*/
private static final String ILLEGAL_MIN_LENGTH_STR = "%s长度小于%s";
private static final String ILLEGAL_MAX_LENGTH_STR = "%s长度大于%s";
private static final String ILLEGAL_EQUAL_LENGTH_STR = "%s长度不等于%s";
/**
* 个数类错误字符串
*/
private static final String ILLEGAL_MIN_SIZE_STR = "%s元素个数小于%s";
private static final String ILLEGAL_MAX_SIZE_STR = "%s元素个数大于%s";
private static final String ILLEGAL_EQUAL_SIZE_STR = "%s元素个数不等于%s";
/**
* 数值类错误字符串
*/
private static final String ILLEGAL_MIN_VALUE_STR = "%s值小于%s";
private static final String ILLEGAL_MAX_VALUE_STR = "%s值大于%s";
private static final String ILLEGAL_EQUAL_VALUE_STR = "%s值不等于%s";
private static final String ILLEGAL_FIELD_MISSING_STR = "%s字段缺失";
private static final String ILLEGAL_FIELD_ERROR_STR = "%s中有参数为空";
private static final String GET_VALUE_FAIL_STR = "参数%s获取值失败";
private static final String REQUEST_OBJECT_NOT_NULL_STR = "请求对象为空";
/**
* 基本数据类型set
*/
private static Set<Class> set;
static {
set = new HashSet<>();
set.add(int.class);
set.add(short.class);
set.add(byte.class);
set.add(boolean.class);
set.add(float.class);
set.add(double.class);
set.add(long.class);
set.add(char.class);
}
/**
* 判断为空并且如果字符串不去除空格
*
* @param object
* @param message
* @throws E