自定义注解-判断实体类是否为null,限制字段长度

我们写接口经常要做字段必填校验以及字段长度控制,前端访问就以实体类来传参,这样加上注解就可以实现判断字段是否为null,限制字段长度
自定义注解主要是分两部分,一部分是实现的util,一部分就是注解了

字段校验非空注解

package cc.mrbird.febs.server.system.utils;

import java.lang.annotation.*;

/**
 * 空指针验证类
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsEmptyAnnotation {
    public boolean isEmpty() default true;

    public String message() default "字段不能为空!";
}

字段长度判断

package cc.mrbird.febs.server.system.utils;


import java.lang.annotation.*;

/**
 * 最大长度验证类
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxSize {
    public int max() default 20;

    public String message() default "长度太长";
}

package cc.mrbird.febs.server.system.utils;


import java.lang.annotation.*;

/**
 * 最小长度验证类
 *
 */
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MinSize {
    public int min() default 0;

    public String message() default "长度太短";
}

下面的util亲测可用

package cc.mrbird.febs.server.system.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
     * 注解验证处理类
     */
    public class AnnotationDealUtil {
        private static Logger log = Logger.getAnonymousLogger();

        /**
         * 注解验证电泳方法
         * @param bean 验证的实体
         * @return
         */
        @SuppressWarnings("unchecked")
        public static Map<String, Object> validate(Object bean) {
            Map<String, Object> result = new HashMap<String, Object>();
            result.put("message", "验证通过");
            result.put("result", true);
            Class<?> cls = bean.getClass();

            // 检测field是否存在
            try {
                // 获取实体字段集合
                Field[] fields = cls.getDeclaredFields();
                for (Field f : fields) {
                    // 通过反射获取该属性对应的值
                    f.setAccessible(true);
                    // 获取字段值
                    Object value = f.get(bean);
                    // 获取字段上的注解集合
                    Annotation[] arrayAno = f.getAnnotations();
                    for (Annotation annotation : arrayAno) {
                        // 获取注解类型(注解类的Class)
                        Class<?> clazz = annotation.annotationType();
                        // 获取注解类中的方法集合
                        Method[] methodArray = clazz.getDeclaredMethods();
                        for (Method method : methodArray) {
                            // 获取方法名
                            String methodName = method.getName();
                            // 过滤错误提示方法的调用
                            if(methodName.equals("message")) {
                                continue;
                            }
                            // 初始化注解验证的方法处理类
                            Object obj = AnnotationDealUtil.class.newInstance();
                            // 获取方法
                            try {
                                // 根据方法名获取该方法
                                Method m = obj.getClass().getDeclaredMethod(methodName, Object.class, Field.class);
                                // 调用该方法
                                result = (Map<String, Object>)m.invoke(obj, value, f);
                                //验证结果 有一处失败则退出 
                                if(result.get("result").equals(false)) {
                                    return result;
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                log.info("找不到该方法:"+methodName);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.info("验证出错");
            }
            return result;
        }

        /**
         * 验证是否空值
         *
         * @param value 参数值
         * @param field 字段
         * @return
         */
        public Map<String, Object> isEmpty(Object value, Field field) {
            Map<String, Object> validateResult = new HashMap<String, Object>();
            IsEmptyAnnotation annotation = field.getAnnotation(IsEmptyAnnotation.class);
            if(value == null || value.equals("")) {
                validateResult.put("message", field.getName() + annotation.message());
                validateResult.put("result", false);
            } else {
                validateResult.put("message", "验证通过");
                validateResult.put("result", true);
            }
            return validateResult;
        }

        /**
         * 验证最小值
         *
         * @param value 参数值
         * @param field 字段
         * @return
         */
        public Map<String, Object> min(Object value, Field field) {
            Map<String, Object> validateResult = new HashMap<String, Object>();
            MinSize annotation = field.getAnnotation(MinSize.class);
            if(value != null && value.toString().length() < annotation.min()) {
                validateResult.put("message", annotation.message());
                validateResult.put("result", false);
            } else {
                validateResult.put("message", "验证通过");
                validateResult.put("result", true);
            }
            return validateResult;
        }
        /**
         * 验证最大值
         *
         * @param value 参数值
         * @param field 字段
         * @return
         */
        public Map<String, Object> max(Object value, Field field) {
            Map<String, Object> validateResult = new HashMap<String, Object>();
            MaxSize annotation = field.getAnnotation(MaxSize.class);
            if(value != null && value.toString().length() > annotation.max()) {
                validateResult.put("message", annotation.message());
                validateResult.put("result", false);
            } else {
                validateResult.put("message", "验证通过");
                validateResult.put("result", true);
            }
            return validateResult;
        }
        //测试
        public static void main(String[] args) {
            Test test = new Test();
            test.setName("11");
            test.setAge("");
            test.setSex("12");
            System.out.println( validate(test));

        }
    }

测试实体类

package cc.mrbird.febs.server.system.utils;

import lombok.Data;

@Data
public class Test {
    @IsEmptyAnnotation
    private String name;
    @MaxSize(max=2)
    private String sex;
    @MinSize(min = 1)
    private String age;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现字段英文转换为中文描述,您可以自定义一个注解,然后在实体类的字段上使用该注解。以下是一个示例: 首先,创建一个自定义注解 `@FieldDescription`: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldDescription { String value() default ""; } ``` 然后,在您的实体类中使用该注解,并将字段的英文描述作为注解的值: ```java public class MyClass { @FieldDescription("姓名") private String name; @FieldDescription("年龄") private int age; // 省略其他字段和方法 } ``` 接下来,您可以编写一个工具类,使用反射来获取字段的中文描述: ```java import java.lang.reflect.Field; public class FieldTranslator { public static String translateField(Class<?> clazz, String fieldName) { try { Field field = clazz.getDeclaredField(fieldName); FieldDescription annotation = field.getAnnotation(FieldDescription.class); if (annotation != null) { return annotation.value(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } return fieldName; // 如果找不到注解,则返回字段名 } } ``` 使用该工具类,您可以将实体类的字段名称转换为中文描述: ```java public class Main { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(FieldTranslator.translateField(MyClass.class, "name")); // 输出:姓名 System.out.println(FieldTranslator.translateField(MyClass.class, "age")); // 输出:年龄 } } ``` 这样,您就可以通过自定义注解和工具类来实现实体字段的英文转换为中文描述了。希望对您有所帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值