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

    我们写接口经常要做字段必填校验以及字段长度控制,前端访问就以实体类来传参,这样加上注解就可以实现判断字段是否为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;
    }
    
    
    展开全文
  • 这个是用来验证表单传来的json对象里是否必填,如果值... * java反射机制判断对象所有属性是否全部为空 * @param obj * @return 返回属性名称 */ public static String checkObjFieldIsNotNull(Object obj,Stri

    这个是用来验证表单传来的json对象里是否必填,如果值为null或者“”时返回属性的名字

    代码

        /**
         *  java反射机制判断对象所有属性是否全部为空
         * @param obj
         * @return 返回属性名称
         */
        public static String checkObjFieldIsNotNull(Object obj,String remark){
            try {
                for (Field f : obj.getClass().getDeclaredFields()) {
                    f.setAccessible(true);
                    if(f.getName().equals(remark)){
                        continue;
                    }
                    if (f.get(obj) == null || f.get(obj) == "") {
                        return f.getName();
                    }
                }
            }catch (Exception e){
                return null;
            }
            return null;
        }

    如果只需要返回boolean类型可以改成下面这种

        /**
         *  java反射机制判断对象所有属性是否全部为空
         * @param obj
         * @return 返回属性名称
         */
        public static boolean checkObjFieldIsNotNull(Object obj,String remark){
            try {
                for (Field f : obj.getClass().getDeclaredFields()) {
                    f.setAccessible(true);
                    if(f.getName().equals(remark)){
                        continue;
                    }
                    if (f.get(obj) == null || f.get(obj) == "") {
                        return false;
                    }
                }
            }catch (Exception e){
                return false;
            }
            return true;
        }

    之后遇到有些对象运行某些成员属性w为null,采用上面的方法就有点不可用了,所有采用了一种注解的方式

    在类属性上添加@AllowNull,则可以运行这个属性为null。

    关于注解,可以看这篇文章秒懂,Java 注解 (Annotation)你可以这样学

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface AllowNull {
        String value() default "";
    }

    判断方法

        /**
         * 通过实体类中添加注解来判断是否对象是否可以为null
         * @param obj
         * @return
         */
        public static Boolean checkNotNull(Object obj) {
            try {
                Class<?> clazz = obj.getClass();
                //获得私有的成员属性
                Field[] fields = clazz.getDeclaredFields();
                if(fields!=null && fields.length>0){
                    for(Field f : fields){
                        f.setAccessible(true);
                        //判断AllowNull注解是否存在
                        if(f.isAnnotationPresent(AllowNull.class)){
                            continue;
                        }else {
                            if(f.get(obj)==null || "".equals(f.get(obj))){
                                return false;
                            }
                        }
                    }
                }
            } catch (IllegalAccessException e) {
                return false;
            }
            return true;
        }

    最后测试

    public class AnnoTest {
        @AllowNull
        private String name;
    
        public static void main(String[] args) {
            AnnoTest annoTest = new AnnoTest();
            Boolean aBoolean = ReflectUtils.checkNotNull(annoTest);
            System.out.println(aBoolean);
        }
    }

    输出结果

    结果输出true
    展开全文
  • 下面是主要的验证注解及说明: 注解 适用的数据类型 说明 @AssertFalse Boolean, boolean 验证注解的元素值是false @AssertTrue Boolean, boolean 验证注解的元素值是true @DecimalMax(value=x) ...

    下面是主要的验证注解及说明:

    注解 适用的数据类型 说明
    @AssertFalse Boolean, boolean 验证注解的元素值是false
    @AssertTrue Boolean, boolean 验证注解的元素值是true
    @DecimalMax(value=x) BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. 验证注解的元素值小于等于@ DecimalMax指定的value值
    @DecimalMin(value=x) BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. 验证注解的元素值小于等于@ DecimalMin指定的value值
    @Digits(integer=整数位数, fraction=小数位数) BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. 验证注解的元素值的整数位数和小数位数上限
    @Future java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. 验证注解的元素值(日期类型)比当前时间晚
    @Max(value=x) BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented by the character sequence is evaluated), any sub-type of Number. 验证注解的元素值小于等于@Max指定的value值
    @Min(value=x) BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented by the char sequence is evaluated), any sub-type of Number. 验证注解的元素值大于等于@Min指定的value值
    @NotNull Any type 验证注解的元素值不是null
    @Null Any type 验证注解的元素值是null
    @Past java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. 验证注解的元素值(日期类型)比当前时间早
    @Pattern(regex=正则表达式, flag=) String. Additionally supported by HV: any sub-type of CharSequence. 验证注解的元素值与指定的正则表达式匹配
    @Size(min=最小值, max=最大值) String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence. 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
    @Valid Any non-primitive type(引用类型) 验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象
    @NotEmpty CharSequence,Collection, Map and Arrays 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @Range(min=最小值, max=最大值) CharSequence, Collection, Map and Arrays,BigDecimal, BigInteger, CharSequence, byte, short, int, long and the respective wrappers of the primitive types 验证注解的元素值在最小值和最大值之间
    @NotBlank CharSequence 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    @Length(min=下限, max=上限) CharSequence 验证注解的元素值长度在min和max区间内
    @Email CharSequence 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

    举个例子:

    private BigDecimal overrunValue;// 超限数值
    

    BigDecimal 类型的字段overrunValue,它在表字段值范围是 decimal(12,4),那么对应的类字段注解为

    @Digits(integer=8, fraction=4, message="数值的整数位数最多8位和小数位数最多4位")
    
    展开全文
  • 插件地址https://gitee.com/lsc-git/lsc.git 主要利用 aop 和 反射 实现

    插件地址  https://gitee.com/lsc-git/lsc.git

     

    主要利用 aop 和 反射  实现

    展开全文
  • entity实体类,是和数据表一一对应的,一个实体一张表 涉及lombok,下面先介绍lombok中4个基本注解的使用 @Data注解: 基于lombok,主要作用是提高代码的简洁,此注解在类上,提供类所有属性的get和set方法,同时...
  • 接口字段转实体是否为空判断

    千次阅读 2017-09-29 17:21:32
    在开发中如果需要和第三方进行接口交互,这时候对接口字段校验就是必不可少的,对方如果少传字段,或是必传字段为空,如果我们不做判断,很可能导致某个流程出错一般校验无非就是以下这种处理方式if(requestVo....
  • JPA实体类中的注解

    千次阅读 2017-01-06 11:02:36
    JPA实体类中的注解学习JPA时,实体类中的注解是必须指导和理解的,现在把所有常用的注解按照自己的理解整理一下 。首先认识一下什么是JPA JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的...
  • Jpa 实体类常用注解

    千次阅读 2018-02-26 18:46:46
    记录一些spring-data-jpa常用的注解,代码运行环境:spring boot + ...唯一参数name:指定实体类名称,默认当前实体类的非限定名称。 若给了name属性值即@Entity(name=&amp;quot;XXX&amp;quot;),则jpa...
  • mybatis plus实体类注解使用

    千次阅读 2020-07-07 15:59:51
    mybatis plus实体类注解使用前言特性支持数据库框架结构@TableName@TableId@TableField@Version:乐观锁注解、标记@KeySequence:序列主键策略@EnumValue:通枚举类注解@TableLogic:表字段逻辑处理注解(逻辑删除)...
  • hibeinate 实体类注解

    2017-03-16 14:46:25
    JPA 中将一个类注解实体类(entity class)有两种不同的注解方式:基于属性(property-based)和基于字段(field-based)的注解 基于字段的注解, 就是直接将注解放置在实体类的字段的前面 基于属性的注解, 就是...
  • java利用反射机制获取实体类属性自定义注解说明
  • 如果遇到上述1.2情况时,属性判就比较麻烦了,特别是属性是基本类型时,比如的id属性是long类型时,这时可以用下面的代码(下面的代码是看网上提供的判断类是否null的判断方法) 修改上述代码下图,就...
  • SpringBoot实体类验证注解

    千次阅读 2018-10-07 10:18:03
    实体类添加注解 @MyConstraint( message="这是一个测试验证注解" ) private Integer id; 附加内容:@JsonView /** * @JsonView 使用步骤 * 1、使用接口来声明多个视图 * 2、在值对象的get方法上...
  • HIbernate实体类注解配置

    千次阅读 2016-10-22 12:29:02
    一、级别注解 1、@Entity(name="EntityName")  必须 name为可选,对应数据库中一的个表 2、@Table(name="",catalog="",schema="") 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的...
  • * 实体检验自定义注解类 * @author 李 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ValidateEntity { public boolean required() default false;//是否检验null ...
  • 首先是定义一个实体类,如下 /* * 定义用户,通过注解映射到数据库 */ @Table("user") public class User { @Column("id") private int id; @Column("username") private String username; @Column(...
  • ① @Entity@Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Customer,它将映射到数据库中的 customer 表上。② @Table当实体类与其映射的数据库表名不同名...
  • 一、注解的基础 1.注解的定义:Java文件叫做Annotation,用@interface表示。 2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。 3.注解的保留策略: @Retention...
  • JPA注解的使用,用于实体类注解

    千次阅读 2017-03-25 16:12:05
    当在容器中时,服务器将会首先加载所有标注了@Entity注释的实体类,其中@Entity中的“name”属性表示实体名称,若不作设置,默认标注实体类的名称(注意大小写与系统的关系。)。 @Entity标注是必需的 ,name...
  • spring 中对实体类字段校验注解@Valid 说明及使用 先看下注释说明: 注解 说明 @Null 限制只能null @NotNull 限制必须不null @AssertFalse 限制必须false @AssertTrue 限制必须true @...
  • Spring MVC 实体类注解

    千次阅读 2015-12-18 13:15:18
    另一个继承本,那么本里的属性应用到另一个中 @Inheritance(strategy = InheritanceType.JOINED )  @Table(name="INFOM_TESTRESULT") public class TestResult extends IdEntity{}   1、@...
  • 前面学习了如何自定义一个注解:java如何优雅的自定义一个注解 下面来实战演示一下... * 判断屬性不为空注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface NotNull { /*
  • 创建需要被校验的实体类 public class Foo { @NotBlank private String name; @Min(18) private Integer age; @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误") @NotBlank...
  • java 判断class是否有指定注解

    千次阅读 2020-08-11 09:55:00
    Class<?> aClass = t.getClass(); SqlTable sqlTableAnnotation = aClass.getAnnotation(SqlTable.class);...SqlTable.class就是对应的注解判断返回的对象是否是null就知道是否有对应的注解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,454
精华内容 13,781
关键字:

判断实体类是否为空的注解