JAVA

java使用注解校验对象属性值数据长度

开发过程由于经常需要组报文,按一定的协议组成交互数据,报文的数据由多个参数组成,且参数的长度基本都有固定的长度,然后有些协议的参数个数可能达到几十个之多,为了保障数据的完整性,同时又不做if(data.length())这样大量的体力活,这里介绍一种使用注解来完成这个校验的动作。

定义注解

@Target({ ElementType.FIELD, ElementType.TYPE })
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface DataLen
{
    int value();
}

定义校验参数长度的帮助类

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
 * 校验数据长度的帮助类
 * 
 * @author lupf
 * 
 */
public class DataLenCheckHelper
{
    /**
     * 校验数据属性至
     * 
     * @param obj
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void checkAttributeValueLen(Object obj) throws Exception
    {
        if (null != obj)
        {
            // 得到class
            Class cls = obj.getClass();
            System.out.println("校验对象中参数的数据长度是否符合要求,校验对象:" + cls.getName());
            // 得到所有属性
            Field[] fields = cls.getDeclaredFields();
            for (int i = 0; i < fields.length; i++)
            {// 遍历
                try
                {
                    // 得到属性
                    Field field = fields[i];
                    Annotation[] anns = field.getAnnotations();
                    DataLen dataLen = null;
                    for (Annotation ann : anns)
                    {
                        if (ann instanceof DataLen)
                            dataLen = (DataLen) ann;
                    }

                    // 判断该属性是否有校验数据长度的注解
                    if (null != dataLen)
                    {
                        // 打开私有访问
                        field.setAccessible(true);
                        // 获取属性
                        String name = field.getName();
                        // 获取属性值
                        Object value = field.get(obj);
                        // 指定的长度
                        int len = dataLen.value();
                        // 数据的长度
                        int vaLen = 0;
                        String data = null;
                        // 一个个赋值
                        if (null != value && value instanceof String)
                        {
                            data = (String) value;
                            vaLen = data.length();
                        }

                        if (vaLen != len)
                        {
                            System.out.print("对象:" + cls.getName() + "中存在不符合条件的参数,参数名:" + name + "参数值:" + data + "指定的数据长度:" + len + "实际长度:" + vaLen
                                    + "不符合条件");
                            throw new Exception();
                        }
                    }
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

测试

  • 定义测试类
public class TestObj
{
@DataLen(5)
public String data1;

@DataLen(10)
public String data2;

public TestObj(String data1, String data2)
{
    this.data1 = data1;
    this.data2 = data2;
}
}
  • main方法测试

正常

    public static void main(String[] args)
    {
        try
        {
            TestObj testObj = new TestObj("12345", "1122334455");
            DataLenCheckHelper.checkAttributeValueLen(testObj);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
        }

    }

异常

public static void main(String[] args)
    {
        try
        {
            TestObj testObj = new TestObj("123456", "1122334455");
            DataLenCheckHelper.checkAttributeValueLen(testObj);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
        }

    }

到此就可以一劳永逸了,之后所有的数据对象只要在定义的时候就把相关的参数指定长度,那么在之后的实例化之后即可对参数的长度进行校验,可以减少大量的体力活。