使用自定义注解做参数必填的校验
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用自定义注解做参数必填的校验相关的知识,希望对你有一定的参考价值。
参考技术A import java.lang.annotation.ElementType;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamsRequired
/**
* 必须参数
* @return
*/
boolean requrie()default true;
public class BaseDto
public boolean validate(Object obj)throws Exception
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields)
if(field.isAnnotationPresent(ParamsRequired.class))
ParamsRequired paramsRequired = field.getAnnotation(ParamsRequired.class);
if(paramsRequired.requrie())
// 如果类型是String
if (field.getGenericType().toString().equals("class java.lang.String")) // 如果type是类类型,则前面包含"class ",后面跟类名
// 拿到该属性的getter方法
Method m = obj.getClass().getMethod("get" + getMethodName(field.getName()));
String val = (String) m.invoke(obj);// 调用getter方法获取属性值
if(StringUtils.isEmpty(val))
throw new ApiException(field.getName() +"属性,不能为空!");
else if (field.getGenericType().toString().equals("class java.lang.Integer")) // 如果type是类类型,则前面包含"class ",后面跟类名
Method m = obj.getClass().getMethod("get" + getMethodName(field.getName()));
Integer val = (Integer) m.invoke(obj);// 调用getter方法获取属性值
if(StringUtils.isEmpty(val))
throw new ApiException(field.getName() +"属性,不能为空!");
// 设置字段可访问(必须,否则报错)
field.setAccessible(true);
Class curFieldType = field.getType();
// 集合List元素
if (List.class.equals(curFieldType))
// 当前集合的泛型类型
Type genericType = field.getGenericType();
if (null == genericType)
continue;
if (genericTypeinstanceof ParameterizedType)
Method m = obj.getClass().getMethod("get" + getMethodName(field.getName()));
List objectList = (List) m.invoke(obj);// 调用getter方法获取属性值
if (!ObjectUtils.isEmpty(objectList))
//循环遍历获取到数据
for (int i =0; i < objectList.size(); i++)
//递归循环查找
validate(objectList.get(i));
return true;
/**
* 把一个字符串的第一个字母大写、效率是最高的、
*/
private StringgetMethodName(String fildeName)throws Exception
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] -'a' +'A');
return new String(items);
public class Student extends BaseDto
@ParamsRequired
private String name;//姓名
private String gender;//性别
@ParamsRequired
private String age;//年龄
@Test
public void test11()
Student s=new Student();
s.setName="111";
try
s.validate(s);
catch (Exception e)
e.printStackTrace();
System.out.println(e.getMessage());
以上是关于使用自定义注解做参数必填的校验的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot Validation参数校验 详解自定义注解规则和分组校验