精华内容
下载资源
问答
  • 非空注解
    2022-08-13 14:19:25

    一、Java 正则表达式注解

    @Pattern(regexp = "^((\\+86)|(86))?(13)\\d{9}$",message = "请输入正确的手机号")

    1 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
    2 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
    3 只能输入数字:"^[0-9]*$"。
    4 只能输入n位的数字:"^\d{n}$"。
    5 只能输入至少n位的数字:"^\d{n,}$"。
    6 只能输入m~n位的数字:。"^\d{m,n}$"
    7 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
    8 只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
    9 只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
    10 只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
    11 只能输入非零的负整数:"^\-[1-9][]0-9"*$。
    12 只能输入长度为3的字符:"^.{3}$"。
    13 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
    14 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
    15 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
    16 只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
    17 只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
    18 验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
    19 验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
    20 只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
    21 验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
    22 验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
    23 验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
    24 验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
    25 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
    26 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
    27 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
    28 匹配双字节字符(包括汉字在内):[^\x00-\xff]
    29 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
    30 String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;}
    31 匹配空行的正则表达式:\n[\s| ]*\r
    32 匹配html标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
    33 匹配手机号和电话号:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
    34 匹配(+86或者86)手机号:^((\\+86)|(86))?(13)\\d{9}

    二、非空判断注解

    @NotEmpty(message = "名称不能为空!!")
    private String name;
    更多相关内容
  • pom文件添加依赖 <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId>...1. 创建实体类并且添加非空注解 在此说明 lomboo

    pom文件添加依赖

      <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>6.0.17.Final</version>
      </dependency>
    

    1. 创建实体类并且添加非空注解

    在此说明 lombook的 @Data有bug,有的时候会出现无法获取到值,值为null的情况,最好使用set,get方法和tostring重写
    @Slf4j
    @Data
    public class Test {
    
        @NotEmpty(message = "名称不能为空!")
        private String name;
        @NotEmpty(message = "性别不能为空!")
        private String sex;
        @NotEmpty(message = "地址不能为空!")
        private String address;
        //注意这里如果字段的类型为 int 类型,该注解会失效,因为int类型的默认值为0,不传参数就使用默认值,为避免出现类似情况,可以使用包装类Integer ,他们的区别可以查一下,在这里不做详解
        @NotNull(message = "年龄不能为空!")
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public static Logger getLog() {
            return log;
        }
    
        @Override
        public String toString() {
            return "test{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    ", address='" + address + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    

    控制器

    在方法的参数中需要使用注解 @Valid 与实体类中的为空注解结合使用
    @Slf4j
    @RestController
    @RequestMapping("/api/test")
    public class TestController {
    
        @PostMapping("/add")
        public void  add(@RequestBody @Valid Test test){
            log.info("====新增的数据===="+test);
    
        }
    }
    

    测试,这里使用的测试工具是RunAPI

    通过JSON传参
    正常返回结果
    {
    "name":"测试",
    "age":"22",
    "address":"444444",
    "sex":"男"
    }
    

    缺少age传值

    {
    "name":"测试",
    "address":"444444",
    "sex":"男"
    }
    
    返回结果
    {6 items
    "timestamp":"2022-04-01T03:28:45.102+0000"
    "status":400
    "error":"Bad Request"
    "errors":[1 item
    		0:{8 items
    		"codes":[...]4 items
    		"arguments":[...]1 item
    		"defaultMessage":"年龄不能为空!"
    		"objectName":"test"
    		"field":"age"
    		"rejectedValue":NULL
    		"bindingFailure":false
    		"code":"NotNull"
    		}
    ]
    "message":"Validation failed for object='test'. Error count: 1"
    "path":"/api/test/add"
    }
    
    
    展开全文
  • EasyExcel唯一遗憾的地方,非空校验比较麻烦。

    写在前面

    今天开发excel导入数据的功能,一切都很顺利。但是当看到需求文档,其中有几个列的数据是必输的。于是我想到了,在实体类属性上加@NotBlank注解不就可以了嘛!但是我写接口入参是一个文件,所以解析实体后这个注解根本不起作用。于是想到自己创建自定义注解,校验非空的列。

    正题

    1.创建注解类

    写过注解的同学应该都比较熟悉了,直接上代码。

    字符串非空校验

    /**
     * Excel导入必填校验注解
     *
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelValid {
        String message() default "非空字段必填";
    }

    字符串长度校验注解

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelStrLengthValid {
        int length() default 0;
        String message() default "字段超长";
    }

    int长度校验

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelIntValid {
        int min();
        int max();
        String message() default "整数超过长度范围";
    }

    还可以写其他类型的校验注解,这里就不展示了。

    2.导入字段检验逻辑

    public class ExcelInValid {
    
        /**
         * Excel导入字段校验
         *
         * @param object 校验的JavaBean 其属性须有自定义注解
         * @author linmaosheng
         */
        public static void valid(Object object) {
            Field[] fields = object.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                //属性的值
                Object fieldValue = null;
                try {
                    fieldValue = field.get(object);
                } catch (IllegalAccessException e) {
                    //BusinessException是我自定义的异常,这里需要改成你自己写的自定义异常
                    throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), field.getAnnotation(ExcelValid.class).message());
                }
    
                //是否包含必填校验注解
                boolean isExcelValid = field.isAnnotationPresent(ExcelValid.class);
                if (isExcelValid && Objects.isNull(fieldValue)) {
                    throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), field.getAnnotation(ExcelValid.class).message());
                }
                //是否包含字符串长度校验注解
                boolean isExcelStrValid = field.isAnnotationPresent(ExcelStrValid.class);
                if (isExcelStrValid) {
                    String cellStr = fieldValue.toString();
                    int length = field.getAnnotation(ExcelStrValid.class).length();
                    if (StringUtils.isNotBlank(cellStr) && cellStr.length() > length) {
                        throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), field.getAnnotation(ExcelStrValid.class).message());
                    }
                }
                //是否包含int类型校验注解
                boolean isExcelIntValid = field.isAnnotationPresent(ExcelIntValid.class);
                if (isExcelIntValid) {
                    if (fieldValue instanceof Integer) {
                        int cellInt = Integer.parseInt(fieldValue.toString());
                        int min = field.getAnnotation(ExcelIntValid.class).min();
                        int max = field.getAnnotation(ExcelIntValid.class).max();
                        if (cellInt < min || cellInt > max) {
                            throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), field.getAnnotation(ExcelIntValid.class).message());
                        }
                    }
                }
                //是否包含decimal类型注解
                boolean isExcelDecimalValid = field.isAnnotationPresent(ExcelDecimalValid.class);
                if (isExcelDecimalValid) {
                    if (isBigDecimal(fieldValue.toString())) {
                        BigDecimal cellDecimal = new BigDecimal(fieldValue.toString());
                        BigDecimal min = new BigDecimal(field.getAnnotation(ExcelDecimalValid.class).min());
                        BigDecimal max = new BigDecimal(field.getAnnotation(ExcelDecimalValid.class).max());
                        if (cellDecimal.compareTo(min) < 0 || cellDecimal.compareTo(max) > 0) {
                            throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), field.getAnnotation(ExcelDecimalValid.class).message());
    
                        }
                    } else {
                        throw new BusinessException(ErrorEnum.PARAM_VALIDATE_ERROR.getCode(), "不是小数数字类型");
    
                    }
                }
            }
        }
    
        private static boolean isBigDecimal(String decimal) {
            try {
                BigDecimal bd = new BigDecimal(decimal);
                return true;
            } catch (NumberFormatException e) {
                return false;
            }
        }
    }

    3.怎么用注解

    首先我们需要写个通用的Listener,要继承AnalysisEventListener,而且service要实现saveData()方法。

    如下:

    public class UploadDataListener<T> extends AnalysisEventListener<T> {
        private static final Logger LOGGER = LoggerFactory.getLogger(UploadDataListener.class);
        /**
         * 每隔500条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 500;
        List<T> list = new ArrayList<>();
        /**
         * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        private final ExcelDataPersistentService<T> service;
    
        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         * @param service
         */
        public UploadDataListener(ExcelDataPersistentService<T> service) {
            this.service = service;
        }
    
        /**
         * 这个每一条数据解析都会来调用
         * @param context
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
    
            ExcelImportValid.valid(data);
            list.add(data);
            // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
            if (list.size() >= BATCH_COUNT) {
                saveData();
                // 存储完成清理 list
                list.clear();
            }
        }
    
        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            saveData();
            LOGGER.info("所有数据解析完成!");
        }
    
        /**
         * 加上存储数据库
         */
        private void saveData() {
            LOGGER.info("{}条数据,开始存储数据库!", list.size());
            service.saveData(list);
            LOGGER.info("存储数据库成功!");
        }

    3.1怎么来用这个Listener?

    例如:我写个上传的接口

    先写Controller,代码如下:

        @PostMapping("/upload")
        @ApiOperation("上传文件")
        public ResultDTO<String> upload(@RequestBody MultipartFile file) throws Throwable {
            service.upload(file);
            return ResultDTO.ok("upload success");
        }

    接着写service,代码如下:

        /**
         * 导入excel并持久化
         * @param file
         * @throws Exception
         */
        void upload(MultipartFile file) throws Throwable;

    service实现类,如下:

      @Override
        public void upload(MultipartFile file) throws Throwable {
            UploadDataListener<Student> listener = new UploadDataListener<>(studentService);
            excelService.uploadExcel(file, Student.class, listener);
        }

    注意:这里的studentService要是实现saveData()方法,这个方法就是用来保存你的数据的。

    读取excel方法

     @Override
        public void uploadExcel(MultipartFile file, Class<?> clazz, UploadDataListener<?> listener) throws Throwable {
            try {
                EasyExcel.read(file.getInputStream(), clazz, listener).sheet().doRead();
            }catch (Exception e){
                if (e.getCause() !=null){
                    throw e.getCause();
                }else {
                    throw e;
                }
            }
        }

    实体类添加非空注解

    @Data
    public class Student extends BaseEntity {
    
        private static final long serialVersionUID = 1L;
    
        @ExcelProperty(value = "学生姓名", index = 0)
        @ExcelValid(message = "学生姓名不能为空")
        private String name;
    }

    以上就是通过自定义注解,来实现excel参数的一些校验规则。

    有疑问请大家留言。

    展开全文
  • 以下注解都用于属性上 1.要求传入的参数对象非空 @NotNull (对象非空) 2.要求传入的参数String类型字段非空 @NotBlank (String类型非空) 3.要求显示在swagger中针对某字段的友好提示 @ApiModelProperty(value =...

    校验非空注解

    导入的包:
    import org.hibernate.validator.constraints.NotBlank; 
    import org.hibernate.validator.constraints.NotEmpty;
    import javax.validation.constraints.NotNull;
    

    1.要求传入的参数对象非空
    @NotNull (对象非空)

    验证对象是否不为null, 无法查检长度为0的字符串。
    作用于属性上

    也可用于对日期格式的数据判空
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;
    
    import javax.validation.constraints.NotNull;
    import java.util.Date;
    
    @ApiModel(value = "假日DTO")
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public class HolidayDTO {
    
        @ApiModelProperty(value = "日期",required = true)
        @JsonFormat(pattern = "yyyy-MM-dd")
        @NotNull(message = "日期不能为null")
        private Date dateStr;
    }
    

    2.要求传入的参数String类型字段非空
    @NotBlank (String类型非空)

    检查约束 (字符串) 是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格。
    作用于属性上

    3.@NotEmpty
    **检查(集合)**约束元素是否为NULL或者是EMPTY。
    作用于属性上

    swagger注解

    1.@ApiModel(value = ”类说明“(一般为类对应的中文释义))
    用于类上,搭配@ApiModelProperty使用

    2.要求显示在swagger中针对某字段的友好提示
    @ApiModelProperty(value = ”字段说明“(一般为字段对应的中文释义),required = true(是否必传),notes=”“(针对字段的注释说明))

    展开全文
  • 1定义一个在方法上作用的注解@Retention(RetentionPolicy.RUNTIME) // 表示注解在运行时依然存在@Target(ElementType.METHOD)@Documentedpublic @interface noNull {public String str() default "";}2定义一个拦截...
  • 注解非空判断

    2022-02-15 17:23:59
    注解非空判断
  • 在异常捕捉类中定义方法如下: ... @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public CommonResult<String> exceptionHandler(MethodArgumentNotValidException ex) { ...
  • 实体类中需要判断非空的成员变量加上注解 @ApiModelProperty(value = "标题") @NotBlank(message = "标题不得为空") private String title; @ApiModelProperty(value = "标题") @NotNull(message = "标题不得...
  • @NotNull 适用于所有对象,不允许对象为null,用于8种基本数据类型是无效的 @NotEmpty 适用于String, collection, map or array,不允许是null而且不允许为empty(即长度不能为0)  源码中的注释为: ...
  • 使用注解统一校验参数非空

    千次阅读 2019-08-21 12:40:38
    System.out.println("==========非空校验失败========="); throw new IllegalArgumentException("[" + annotation.content() + "]为空"); } System.out.println(fieldName + "长度:" + String.valueOf...
  • 由于我们提交的表单中字段通常都比较多,如果一个一个的去判断是否为空太麻烦,所以我们通常会使用@NotBlank @NotNull @NotBlank注解校验参数,但字段为空时会抛出MethodArgumentNotValidException异常,包含的信息...
  • java实体类非空判断@NotEmpty、@NotNull等注解无效解决
  • 1.首先定义NotNull注解package com.example.demo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation....
  • 自定义注解: @NotEmpty package ... import java.lang.annotation.*; ... * @Description: 非空注解 * @Date: 2019/5/5 * @Auther: */ @Inherited @Retention(RetentionPolicy.RUNTIME) @...
  • Spring中@NotNull注解@Valid注解使用

    千次阅读 2022-04-18 20:39:37
    在开发中,为了代码的稳定性不报空指针异常,经常需要判断前端传过来的值是否为空,为空的话就返回前端值为空的提示,才能进行下一步的操作。...@NotNull是对整个对象的非空判断 实体类: 实体类需要判断的字段上面
  • 自定义注解,来对对应的方法进行入参校验,为空返回参数错误 新建注解类@interface ParamsVerify @Target(ElementType.METHOD)//枚举,表示注解可能出现在的地方 @Retention(RetentionPolicy.RUNTIME)//运行时保留...
  • 由于项目表单需要校验字段过多,一个一个去判空太麻烦,所以用了@NotNull注解,字段为空会抛出MethodArgumentNotValidException异常。 接下来要取得@NotNull(message=“自定义异常”)里的message内容给前端显示 直接...
  • --引入AOP相应的注解--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</...
  • 请求对象参数中引用注解 @ValidateAnnotation(field = "apply title",length = 100,isNotNull = true) private String applyTitle; controller层中针对参数请求对象加入注解@Valid @PostMapping("/add_employee...
  • //校验器(校验器还可以继续扩充,实现各种格式的校验,在此只是举例)...el.value || Trim(el.value)==''){alert("校验非空");el.value='';var msg=$(el).attr('validate-msg');//提示信息可以自行修改$(el).next('.va...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,000
精华内容 8,000
关键字:

非空注解