范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringBoot自定义校验注解

  校验注解的作用
  系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的。所以我们可能会写大量的   if else   等判断逻辑,特别是在不同方法出现相同的数据时,校验的逻辑代码会反复出现,导致代码冗余,阅读性和可维护性极差。 自定义校验注解引入依赖
  Hibernate框架中有一个组件   hibernate-validator   专门用于数据校验,在平常的Spring项目中虽然数据层不使用Hibernate做  ORM   框架,但是  hibernate-validator   也经常被集成来做数据校验。      org.hibernate.validator     hibernate-validator     6.1.7.Final 
  下面我们写一个用于   URL   校验的注解,实现一个简单的网站信息管理的  URL   校验,做校验的方式我们也使用现成的apache工具包中提供的校验工具。      commons-validator     commons-validator     1.7 实现注解
  校验注解  /**  * 会将注解信息包含在javadoc中  */ @Documented /**  * 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;  * 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,  *   这是默认的生命周期;  * 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;  *  * 一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解  * 如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;  * 如果只是做一些检查性的操作,比如 @Override 和 @Deprecated,使用SOURCE 注解。  */ @Retention(RetentionPolicy.RUNTIME) /**  * 作用在字段上  * TYPE - 作用在类上面  * FILED - 作用在属性上面  * METHOD - 作用在方法上  * CONSTRUCTION - 作用在构造器上  * PARAM - 作用在方法参数上  * 允许多种的情况是 @Target({ElementType.FIELD,ElementType.METHOD})  */ @Target(ElementType.FIELD) /**  * 对应校验类  */ @Constraint(validatedBy = IsUrlValidator.class) public @interface IsUrl {     /**      * 是否 强校验      * @return      */     boolean required() default true;      /**      * 校验不通过返回信息      * @return      */     String message() default "请输入正确的url";      /**      * 所属分组,即在有分组的情况下,只校验所在分组参数      * @return      */     Class<?>[] groups() default {};      /**      * 主要是针对bean,很少使用      *      * @return 负载      */     Class<? extends Payload>[] payload() default {};  }
  校验类
  校验类需要实现   ConstraintValidator   接口,第一个泛型为注解,第二个为校验的数据类型。
  实现这个接口必须要重写   isValid()   方法,在其中实现主要的校验逻辑。 public class IsUrlValidator implements ConstraintValidator {     private boolean isRequired;      /**      * 初始化,获取是否强校验      * @param constraintAnnotation      */     @Override     public void initialize(IsUrl constraintAnnotation) {         isRequired = constraintAnnotation.required();     }      @Override     public boolean isValid(String s, ConstraintValidatorContext context) {         if (!isRequired){             return true;         }else {             UrlValidator validator = UrlValidator.getInstance();             return validator.isValid(s);         }     } }使用自定义注解
  创建   Insert   、  Update   分组别用于区分和开启校验
  用于分组的类需要继承   javax.validation.groups.Default   接口 public interface Update extends Default {} public interface Insert extends Default {}
  创建一个   WebSite   类,对其中  url   、  alternateUrl   进行校验,这个字段分别属于  Insert   分组、  Update   分组的时候进行字段校验。 public class WebSite {     /**      * id      */     private Integer id;     /**      * 网站名称      */     private String name;     /**      * 网址      */     @IsUrl(groups = Insert.class)     private String url;     /**      * 备用网址      */     @IsUrl(groups = Update.class)     private String alternateUrl; }
  具体校验方式如下,在insert接口对   Insert   分组进行校验,也就是校验  url   属性,在updateAlternate接口对  Update   分组进行校验,也就是对  alternateUrl   字段进行校验。 @RestController @RequestMapping("/website") public class WebSiteController {     @RequestMapping("/insert")     public void insert(@RequestBody @Validated(Insert.class) WebSite site){         System.out.println(site);     }      @RequestMapping("/updateAlternate")     public void updateAlternateUrl(@RequestBody @Validated(Update.class) WebSite site){         System.out.println(site);     } }
  若校验不通过,代码会抛出   MethodArgumentNotValidException   异常,我们实现一个统一异常处理类来处理这个异常报错,并返回校验提示信息。 @ControllerAdvice @Slf4j public class GlobalExceptionHandler {     // 处理接口参数数据格式错误异常     @ExceptionHandler(value = MethodArgumentNotValidException.class)     @ResponseBody     public Object errorHandler(HttpServletRequest request, MethodArgumentNotValidException e) {         List allErrors = e.getBindingResult().getAllErrors();          String message = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";"));         log.error("{}请求,发生参数校验异常:{}",request.getServletPath(),message);         return message;     } }
  使用http工具调用接口,返回相关信息
  首先使用一个错误的   url   参数调用  insert   接口,校验不通过,但是调用  updateAlternate   接口可以通过。 POST http://localhost:8080/website/insert Content-Type: application/json {     "id": 1,     "name": "百度",     "url":"htps://www.baidu.com/",     "alternateUrl":"https://www.baidu.com/" }  ###  POST http://localhost:8080/website/updateAlternate Content-Type: application/json {     "id": 1,     "name": "百度",     "url":"htps://www.baidu.com/",     "alternateUrl":"https://www.baidu.com/" }
  调用   insert   接口的返回及日志打印如下 HTTP/1.1 200  Content-Type: text/plain; charset=UTF-8 Content-Length: 21 Date: Wed, 02 Mar 2022 15:30:23  GMTKeep-Alive: timeout=60 Connection: keep-alive  请输入正确的url -------------------------------------- xxx.GlobalExceptionHandler : /website/insert请求,发生参数校验异常:请输入正确的url常用校验注解
  注解
  释义
  @Null
  被注释的元素必须为 null
  @NotNull
  被注释的元素必须不为 null
  @AssertTrue
  被注释的元素必须为 true
  @AssertFalse
  被注释的元素必须为 false
  @Min(value)
  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  @Max(value)
  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  @DecimalMin(value)
  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  @DecimalMax(value)
  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  @Size(max, min)
  被注释的元素的大小必须在指定的范围内,元素必须为集合,代表集合个数
  @Digits (integer, fraction)
  被注释的元素必须是一个数字,其值必须在可接受的范围内
  @Past
  被注释的元素必须是一个过去的日期
  @Future
  被注释的元素必须是一个将来的日期
  @Length(min=, max=)
  被注释的字符串的大小必须在指定的范围内,必须为数组或者字符串,若微数组则表示为数组长度,字符串则表示为字符串长度
  @NotEmpty
  被注释的字符串的必须非空
  @Range(min=, max=)
  被注释的元素必须在合适的范围内
  @NotBlank
  被注释的字符串的必须非空
  @Pattern(regexp = )
  正则表达式校验
  @Valid
  对象级联校验,即校验对象中对象的属性

小米MIX首发液态镜头,网友这比与相机合作更有排面小米春季发布会预热第三天,今日直接放出了王炸,时隔2年的小米MIX回归,关于这款手机,看网友最关心的问题有两点。一是屏幕形态,预热海报中这句展开聊聊就已经暗示,这次的MIX为折叠屏MIX4各部件报价来了,CUP屏幕比三星2K屏更贵小米MIX4的屏下摄像头区域,由于需要缩小像素面积重新设计电路引线更换透明引线基板等等,导致这一小块的成本变得很高,雷军在发布会上表示MIX4的屏下摄像头区域的成本和整块屏差不多,相差500元,OPPOFINDX3标准版与Pro版差在哪OPPOFINDX3系列,标准版81284499元8256GB4999元。Pro版8256GB5499元12256GB5999元16512GB6999元,其中同内存版本,两者只差5将游戏放在SSD是怎样的体验?WDBLACKSN750EKWB1TB装机试玩笔者最近新装了一台电脑游戏主机,目标2K分辨率下流畅运行游戏大作。CPU选用Inteli710700K散片,主板选用微星MPGZ490GAMINGCARBONWIFI,内存选用金士来看网红SSD决斗,西数SN7501TB对上东芝RD5001TB说起网红SSD,西数黑盘SN750当之无愧,凭借其不俗的性能获得口碑与销量双丰收,而笔者最近注意到,这段时间有不少网友咨询西数SN750与东芝RD500究竟选谁的问题。作为东芝旗下满足收集控的小愿望,金士顿鼠年生肖纪念版U盘64G上手玩每到新的一年,金士顿都会推出一款生肖纪念版U盘,今年来到2020庚子鼠年,金士顿鼠年生肖纪念版U盘也如期而至。包装外壳是圆柱状的透明亚克力,可以直视内部。撕开透明封条,打开圆柱状外华为MateX2定档,改为内折方案,折痕有针对性优化2月18日华为MateX2预热正式开始,定档本月22日发布。从全新机身形态以及海报配图来看,这次的MateX2将改为内折屏方案,根据放出的专利,华为针对内折方案折痕问题有针对性的优AMDZen23A平台攒机小记距离7月7日AMDZEN2处理器上市至今已有一个月时间,随ZEN2处理器一起发售的5700系列显卡X570主板也已大量铺货,这一个月时间里面楼主也终于凑齐了装机的全套配件,3A平台华为MateX2正式发布,内折设计,解决折痕缝隙痛点就在刚刚,华为MateX2正式发布,作为一款折叠屏手机,关注点绝对是这块柔性屏上,下面就来看看如今折叠屏已经进展到什么程度了。首先就是折痕问题,目前折叠屏手机中公认折痕控制最好的就挽救Intel平台短板,WDBLACKAN1500上手玩众所周知,AMD去年发布了X570芯片组将PCIe4。0引入到消费级领域,而一众采用PCIe4。0接口的高性能SSD也陆续推出,对于选择Intel平台又或者是那些还在使用非最新AM荣耀30青春版xQQ跨界营销回顾一场以青春为名的大秀不久前,荣耀30青春版联手QQ共同打造了主题为5G青春Q动一夏的营销活动,不仅在业内引起了广泛的关注,荣耀和QQ的用户和粉丝也对其赞誉不已,无论从趣味玩法上还是产品优惠力度上,荣耀
用创新勘探科学富矿来源人民网人民日报葆有好奇之心,才能有所发现,有所创造,有所成就习近平总书记在科学家座谈会上的讲话指出科技创新特别是原始创新要有创造性思辨的能力严格求证的方法,不迷信学术权威,不盲VCPE蜂拥科技投资寻找技术与商业的结合体21世纪经济报道许梦旖广州报道据清科私募通数据统计,2021年前三季度,一级市场获得投资金额最多的前三大行业分别是,半导体及电子设备生物技术医疗健康以及IT,对应的投资金额分别是1写着简单跑得又快的数据库语言SPL数据库语言的目标要说清楚这个目标,先要理解数据库是做什么的。数据库这个软件,名字中有个库字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两条计算事务!也就是我们常数据库SQL约束之NOTNULL今天是日更的47365天大家好,我是阿常,今天我和大家分享数据库SQL约束之NOTNULL。SQL约束的定义SQL约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约2021年菲律宾手机市场realme超越OPPO位列第二,小米跌至第五转眼间,已经是2月份下旬了。尽管2022年已经过去了一个多月的时间,但是国内智能手机市场也才是刚刚热闹起来。相信不少小伙伴都很是期待即将到来的OPPOFindX5系列荣耀Magic金盘科技入选2021年度智能制造试点示范工厂揭榜单位和优秀场景中证网讯(记者万宇)近日,工业和信息化部国家发展改革委财政部市场监管总局联合公布了2021年度智能制造试点示范工厂揭榜单位和优秀场景名单,共110家企业241个场景上榜,金盘科技(有赞小程序微商城小程序怎么做?自己开发好还是用现成的好?很多商家想做小程序,但不知道怎么样做,或是需要准备什么资料,下面我讲一下小程序需要怎么做和准备什么首先看你的预算和需求,有赞能满足市面70的商家需求,需求高市面没现成的小程序能满足21私募投融资周报(2。142。20)红杉高瓴共同领投一家创新器械公司华为哈勃再投一家半导体消费服务剧本杀平台推理大师获A轮融资2月15日消息,剧本杀平台推理大师获得网易集团数千万A轮融资,宇泽资本为本轮融资的独家财务顾问。本轮融资将用于剧本研发采购市场营销投入招商团队招华为OPPO荣耀手机溢价,我们为何会接受国产手机的溢价?感谢邀请华为OPPO荣耀手机溢价,我们为何会接受国产手机的溢价?说直白一点,溢价实际还是因为品牌的实力。因为我们都明白,用户不会无缘无故去选择一款同样配置,但是定价比别人高的产品。汉印CP4000L小型照片打印机乐享生活随拍随印,珍藏生活美好时刻序如何让瞬间美好定格?答案是用照相记录下没有的瞬间,在多年后回看时候能够从一张张相片中回忆起当时的美好情景。这也是80年代人们最为常用的记录方式,小编作为一名80后非常期待过年和过智慧灯杆首个国家标准即将实施行业渗透率有望提升证券时报记者梁谦刚国家标准化管理委员会网站显示,我国智慧灯杆产业的首个国家级标准智慧城市智慧多功能杆服务功能与运行管理规范将于2022年3月1日起正式实施。该标准的发布不仅满足了产