摘要:介紹出發(fā)點(diǎn)在日常開(kāi)發(fā)中經(jīng)常需要對(duì)方法的入?yún)⒆鲂r?yàn),特別是在遠(yuǎn)程調(diào)用的方法中。類字段無(wú)參方法方法參數(shù)為或數(shù)組或集合類型提供長(zhǎng)度或大小校驗(yàn)。類非靜態(tài)方法方法參數(shù)指定參數(shù)校驗(yàn)失敗時(shí)拋出異常。方法方法參數(shù)禁用校驗(yàn)邏輯。
介紹 出發(fā)點(diǎn)
在日常開(kāi)發(fā)中經(jīng)常需要對(duì)方法的入?yún)⒆鲂r?yàn),特別是在遠(yuǎn)程調(diào)用的方法中。
我基于這個(gè)需求便開(kāi)發(fā)了這款工具,可以節(jié)省在這方面所花費(fèi)的精力,通過(guò)配置的注解,在編譯期對(duì)語(yǔ)法樹(shù)進(jìn)行修改,就能為方法加入?yún)?shù)的校驗(yàn)邏輯。
知道Lombok的同學(xué)肯定不少吧,其實(shí)原理都是一樣的。
功能現(xiàn)在所支持的校驗(yàn)有數(shù)字、字符串、數(shù)組、集合和Map,并且能夠在校驗(yàn)失敗時(shí)選擇是拋出異?;蚍祷?cái)?shù)據(jù)。
下面讓我們直接先看下使用效果吧。
public class MyApp { @Throw public Info run(Args args, @Nullable Info info, @Return({"test", "0"}) @NotBlank String name, @Return("null") @NumberRule(min = "1") int num) { // process System.out.println("run"); return new Info(); } }
如上代碼,經(jīng)過(guò)編譯后將會(huì)是這樣的 :
public class MyApp { public MyApp() { } public MyApp.Info run(MyApp.Args args, MyApp.Info info, String name, int num) { if (args == null) { throw new IllegalArgumentException("Invalid input parameter, cause args is null"); } else { String mvar_0 = args.invalid0(); if (mvar_0 != null) { throw new IllegalArgumentException("Invalid input parameter, cause " + mvar_0); } else { if (info != null) { mvar_0 = info.invalid0(); if (mvar_0 != null) { throw new IllegalArgumentException("Invalid input parameter, cause " + mvar_0); } } if (name == null) { return new MyApp.Info("test", (Double)null); } else if (Util.isBlank(name)) { return new MyApp.Info("test", (Double)null); } else if (num < 1) { return null; } else { System.out.println("run"); return new MyApp.Info(); } } } } }
原始的邏輯 System.out.println("run"); new Info(); 被放置在了最后,當(dāng)調(diào)用時(shí)參數(shù)校驗(yàn)都通過(guò)后才會(huì)執(zhí)行。
其實(shí)例子中的代碼省略了對(duì)參數(shù)定義校驗(yàn)注解的部分,這些類在經(jīng)過(guò)編譯器后將會(huì)生成參數(shù)的校驗(yàn)方法。。。完整的代碼如下
public class MyApp { @Throw public Info run(Args args, @Nullable Info info, @Return({"test", "null"}) @NotBlank String name, @Return("null") @NumberRule(min = "1") int num) { // process System.out.println("run"); return new Info(); } class Args { @NumberRule(max = "1000") int id; @NotNull HashMapparam; @Nullable @SizeRule(min = 5) boolean[] value; } static class Info { @SizeRule(min = 50) String name; @Nullable @NumberRule(min = "-25.02", max = "200") Double price; @SizeRule(min = 10, max = 10) List extra; public Info() { } Info(String name, Double price) { this.name = name; this.price = price; } } }
其中的 Args 和 Info 在經(jīng)過(guò)編譯后將會(huì)根據(jù)定義的注解生成校驗(yàn)方法。
static class Info { String name; Double price; Listextra; public Info() { } Info(String name, Double price) { this.name = name; this.price = price; } public String invalid0() { if (this.name == null) { return "name is null"; } else if (this.name.length() < 50) { return "name.length() less than 50"; } else if (this.price != null && this.price > 200.0D) { return "price great than 200.0"; } else if (this.extra == null) { return "extra is null"; } else { return this.extra.size() != 10 ? "extra cannot equals 10" : null; } } } class Args { int id; HashMap param; boolean[] value; Args() { } public String invalid0() { if (this.value != null && this.value.length < 5) { return "value.length less than 5"; } else if (this.id > 1000) { return "id great than 1000"; } else { return this.param == null ? "param is null" : null; } } }
看到這兒,你應(yīng)該對(duì)這個(gè)工具的基本功能有了大概的了解,下面我會(huì)介紹如果使用這個(gè)工具。
使用說(shuō)明 1.添加依賴Maven
io.github.moyada medivh 1.2.0 provided
Gradle
dependencies { compileOnly "io.github.moyada:medivh:1.2.0" }
如果沒(méi)有使用構(gòu)建工具也沒(méi)問(wèn)題,可以從網(wǎng)上下載jar包,一樣配置,在后面用 javac -cp 編譯就好了。
2. 配置注解現(xiàn)在可供使用的注解有這幾種,支持以類、枚舉、接口作為參數(shù)添加校驗(yàn)規(guī)則。
注解 | 作用域 | 作用 |
---|---|---|
@NotNull | 類字段、無(wú)參方法、方法參數(shù) | 為對(duì)象類型的字段或返回值提供非空校驗(yàn),默認(rèn)定義了規(guī)則都會(huì)進(jìn)行非空校驗(yàn)。 |
@Nullable | 類字段、無(wú)參方法、方法參數(shù) | 不進(jìn)行非空校驗(yàn)。 |
@NotBlank | 類字段、無(wú)參方法、方法參數(shù) | 對(duì) String 類型提供不可為空白字符串檢測(cè)。 |
@SizeRule | 類字段、無(wú)參方法、方法參數(shù) | 為 String 或 數(shù)組 或 集合 類型提供長(zhǎng)度或大小校驗(yàn)。 |
@NumberRule | 類字段、無(wú)參方法、方法參數(shù) | 為基礎(chǔ)數(shù)字類型提供大小校驗(yàn)。 |
@Throw | 類、非靜態(tài)方法、方法參數(shù) | 指定參數(shù)校驗(yàn)失敗時(shí)拋出異常。 |
@Return | 非靜態(tài)方法、方法參數(shù) | 指定參數(shù)校驗(yàn)失敗時(shí)返回?cái)?shù)據(jù)。 |
@Exclusive | 方法、方法參數(shù) | 禁用校驗(yàn)邏輯。 |
@Variable | 非靜態(tài)方法、類 | 修改當(dāng)前作用域下校驗(yàn)邏輯產(chǎn)生的變量名和方法名。 |
例如我需要提供一個(gè)判斷String是否為null或空白字符串的方法。
@Return("true") public boolean isEmpty(@NotBlank String str) { return false; }3. 編譯項(xiàng)目
使用構(gòu)建工具的編譯命令, 如 mvn compile 或 gradle build。
或者使用 Java 命令進(jìn)行編譯,如 javac -cp medivh.jar MyApp.java
如上述代碼,經(jīng)過(guò)編譯期后,即可生成方法邏輯,并且創(chuàng)建一個(gè) io.moyada.medivh.support.Util 類提供檢驗(yàn)是否為空白字符串的方法,當(dāng)然也支持自己指定方法。
public boolean isEmpty(String str) { if (str == null) { return true; } else { return Util.isBlank(str); } }結(jié)尾
看完這份介紹,如果有興趣的同學(xué)還可以前往 github 查看,會(huì)有更詳細(xì)的文檔和示例,歡迎大家進(jìn)行使用和提出意見(jiàn)。
github.com/moyada/medivh
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72828.html
摘要:接入分為兩部分,其一是可視化編輯器,在官網(wǎng)上我們可以獲取該編輯器的安裝包,并通過(guò)的插件管理進(jìn)行安裝。借助可視化編輯器,在整個(gè)過(guò)程中我們可以替換大部分手工編寫代碼的工作,進(jìn)行一站式操作。,有趣實(shí)用的分布式架構(gòu)頻道。本文根據(jù) SOFAChannel#5 直播分享整理,主題:給研發(fā)工程師的代碼質(zhì)量利器 —— 自動(dòng)化測(cè)試框架 SOFAActs?;仡櫼曨l以及 PPT 查看地址見(jiàn)文末。歡迎加入直播互動(dòng)釘...
摘要:接口測(cè)試形式單個(gè)接口測(cè)試包含性能測(cè)試和通過(guò)接口調(diào)用進(jìn)行場(chǎng)景測(cè)試。充分來(lái)說(shuō)就是接口測(cè)試相對(duì)容易實(shí)現(xiàn)自動(dòng)化持續(xù)集成。 本文你將了解到 1、接口測(cè)試基本概念,包含什么是接口,什么是接口測(cè)試,為什么要做接口測(cè)試2、接口測(cè)試用例設(shè)計(jì)3、怎樣不用寫代碼,也能快速的根據(jù)開(kāi)發(fā)的API文檔完成接口自動(dòng)化測(cè)試腳本 注:如果你對(duì)接口基本概念和接口測(cè)試用例已熟悉,可以直接跳過(guò),其實(shí)看一遍也無(wú)防,就當(dāng)作 溫故知...
摘要:畢竟永遠(yuǎn)相信本文能給你帶來(lái)意想不到的收獲使用示例關(guān)于數(shù)據(jù)校驗(yàn)這一塊在中的使用案例,我相信但凡有點(diǎn)經(jīng)驗(yàn)的程序員應(yīng)該沒(méi)有不會(huì)使用的,并且還不乏熟練的選手。 每篇一句 NBA里有兩大笑話:一是科比沒(méi)天賦,二是詹姆斯沒(méi)技術(shù) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validati...
摘要:是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)。協(xié)議,是一個(gè)無(wú)狀態(tài)協(xié)議,即所有的狀態(tài)都保存在服務(wù)器端。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的,所以就是表現(xiàn)層狀態(tài)轉(zhuǎn)化。具體說(shuō),就是協(xié)議里面,四個(gè)表示操作方式的動(dòng)詞。 一、SpringMVC概述 Spring為展現(xiàn)層提供的基于MVC設(shè)計(jì)理念的優(yōu)秀的Web框架,是目前最主流的MVC框架之一 Spring3.0之后全面超越Struts2,成為最優(yōu)秀的MVC框架 S...
摘要:如果說(shuō)要使用數(shù)據(jù)校驗(yàn),我十分相信小伙伴們都能夠使用,但估計(jì)大都是有個(gè)前提的環(huán)境。具體使用可參考小家讓支持對(duì)平鋪參數(shù)執(zhí)行數(shù)據(jù)校驗(yàn)?zāi)J(rèn)使用只能對(duì)進(jìn)行校驗(yàn)級(jí)聯(lián)校驗(yàn)什么叫級(jí)聯(lián)校驗(yàn),其實(shí)就是帶校驗(yàn)的成員里存在級(jí)聯(lián)對(duì)象時(shí),也要對(duì)它完成校驗(yàn)。 每篇一句 NBA里有兩大笑話:一是科比沒(méi)天賦,二是詹姆斯沒(méi)技術(shù) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(...
閱讀 1096·2021-11-24 10:24
閱讀 2584·2021-11-22 13:54
閱讀 992·2021-09-24 09:55
閱讀 3592·2019-08-30 15:54
閱讀 1311·2019-08-30 15:44
閱讀 1089·2019-08-30 14:23
閱讀 3195·2019-08-29 13:45
閱讀 1267·2019-08-29 11:19