使用自定义注解做参数必填的校验

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参数校验 详解自定义注解规则和分组校验

springboot中关于自定义注解校验

springBoot参数联合校验,自定义分组校验

自定义注解结合SpringAop实现权限,参数校验,日志等等功能

自定义校验注解的开发

jsr-303 参数校验—自定义校验注解