摘要:介紹出發點在日常開發中經常需要對方法的入參做校驗,特別是在遠程調用的方法中。類字段無參方法方法參數為或數組或集合類型提供長度或大小校驗。類非靜態方法方法參數指定參數校驗失敗時拋出異常。方法方法參數禁用校驗邏輯。
介紹 出發點
在日常開發中經常需要對方法的入參做校驗,特別是在遠程調用的方法中。
我基于這個需求便開發了這款工具,可以節省在這方面所花費的精力,通過配置的注解,在編譯期對語法樹進行修改,就能為方法加入參數的校驗邏輯。
知道Lombok的同學肯定不少吧,其實原理都是一樣的。
功能現在所支持的校驗有數字、字符串、數組、集合和Map,并且能夠在校驗失敗時選擇是拋出異常或返回數據。
下面讓我們直接先看下使用效果吧。
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(); } }
如上代碼,經過編譯后將會是這樣的 :
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(); 被放置在了最后,當調用時參數校驗都通過后才會執行。
其實例子中的代碼省略了對參數定義校驗注解的部分,這些類在經過編譯器后將會生成參數的校驗方法。。。完整的代碼如下
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 在經過編譯后將會根據定義的注解生成校驗方法。
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; } } }
看到這兒,你應該對這個工具的基本功能有了大概的了解,下面我會介紹如果使用這個工具。
使用說明 1.添加依賴Maven
io.github.moyada medivh 1.2.0 provided
Gradle
dependencies { compileOnly "io.github.moyada:medivh:1.2.0" }
如果沒有使用構建工具也沒問題,可以從網上下載jar包,一樣配置,在后面用 javac -cp 編譯就好了。
2. 配置注解現在可供使用的注解有這幾種,支持以類、枚舉、接口作為參數添加校驗規則。
注解 | 作用域 | 作用 |
---|---|---|
@NotNull | 類字段、無參方法、方法參數 | 為對象類型的字段或返回值提供非空校驗,默認定義了規則都會進行非空校驗。 |
@Nullable | 類字段、無參方法、方法參數 | 不進行非空校驗。 |
@NotBlank | 類字段、無參方法、方法參數 | 對 String 類型提供不可為空白字符串檢測。 |
@SizeRule | 類字段、無參方法、方法參數 | 為 String 或 數組 或 集合 類型提供長度或大小校驗。 |
@NumberRule | 類字段、無參方法、方法參數 | 為基礎數字類型提供大小校驗。 |
@Throw | 類、非靜態方法、方法參數 | 指定參數校驗失敗時拋出異常。 |
@Return | 非靜態方法、方法參數 | 指定參數校驗失敗時返回數據。 |
@Exclusive | 方法、方法參數 | 禁用校驗邏輯。 |
@Variable | 非靜態方法、類 | 修改當前作用域下校驗邏輯產生的變量名和方法名。 |
例如我需要提供一個判斷String是否為null或空白字符串的方法。
@Return("true") public boolean isEmpty(@NotBlank String str) { return false; }3. 編譯項目
使用構建工具的編譯命令, 如 mvn compile 或 gradle build。
或者使用 Java 命令進行編譯,如 javac -cp medivh.jar MyApp.java
如上述代碼,經過編譯期后,即可生成方法邏輯,并且創建一個 io.moyada.medivh.support.Util 類提供檢驗是否為空白字符串的方法,當然也支持自己指定方法。
public boolean isEmpty(String str) { if (str == null) { return true; } else { return Util.isBlank(str); } }結尾
看完這份介紹,如果有興趣的同學還可以前往 github 查看,會有更詳細的文檔和示例,歡迎大家進行使用和提出意見。
github.com/moyada/medivh
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72828.html
摘要:接入分為兩部分,其一是可視化編輯器,在官網上我們可以獲取該編輯器的安裝包,并通過的插件管理進行安裝。借助可視化編輯器,在整個過程中我們可以替換大部分手工編寫代碼的工作,進行一站式操作。,有趣實用的分布式架構頻道。本文根據 SOFAChannel#5 直播分享整理,主題:給研發工程師的代碼質量利器 —— 自動化測試框架 SOFAActs。回顧視頻以及 PPT 查看地址見文末。歡迎加入直播互動釘...
摘要:接口測試形式單個接口測試包含性能測試和通過接口調用進行場景測試。充分來說就是接口測試相對容易實現自動化持續集成。 本文你將了解到 1、接口測試基本概念,包含什么是接口,什么是接口測試,為什么要做接口測試2、接口測試用例設計3、怎樣不用寫代碼,也能快速的根據開發的API文檔完成接口自動化測試腳本 注:如果你對接口基本概念和接口測試用例已熟悉,可以直接跳過,其實看一遍也無防,就當作 溫故知...
摘要:畢竟永遠相信本文能給你帶來意想不到的收獲使用示例關于數據校驗這一塊在中的使用案例,我相信但凡有點經驗的程序員應該沒有不會使用的,并且還不乏熟練的選手。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術 相關閱讀 【小家Java】深入了解數據校驗:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validati...
摘要:是目前最流行的一種互聯網軟件架構。協議,是一個無狀態協議,即所有的狀態都保存在服務器端。而這種轉化是建立在表現層之上的,所以就是表現層狀態轉化。具體說,就是協議里面,四個表示操作方式的動詞。 一、SpringMVC概述 Spring為展現層提供的基于MVC設計理念的優秀的Web框架,是目前最主流的MVC框架之一 Spring3.0之后全面超越Struts2,成為最優秀的MVC框架 S...
摘要:如果說要使用數據校驗,我十分相信小伙伴們都能夠使用,但估計大都是有個前提的環境。具體使用可參考小家讓支持對平鋪參數執行數據校驗默認使用只能對進行校驗級聯校驗什么叫級聯校驗,其實就是帶校驗的成員里存在級聯對象時,也要對它完成校驗。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術 相關閱讀 【小家Java】深入了解數據校驗:Java Bean Validation 2.0(...
閱讀 1113·2021-11-24 10:24
閱讀 2597·2021-11-22 13:54
閱讀 1006·2021-09-24 09:55
閱讀 3607·2019-08-30 15:54
閱讀 1324·2019-08-30 15:44
閱讀 1100·2019-08-30 14:23
閱讀 3207·2019-08-29 13:45
閱讀 1287·2019-08-29 11:19