最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)優(yōu)雅的參數(shù)校驗方法詳解

 更新時間:2022年06月27日 11:27:17   作者:WX7251  
這篇文章主要為大家詳細(xì)介紹了Java語言如何實現(xiàn)優(yōu)雅的參數(shù)校驗,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定是幫助,需要的可以參考一下

一、引子

要對方法的參數(shù)進(jìn)行校驗,最簡單暴力的寫法是這個樣子:

    public static void utilA(String a,BigDecimal b){
        if (StringUtils.isEmpty(a)){
            System.out.println("a不可為空");
            return;
        }
        if (b == null){
            System.out.println("b不可為空");
            return;
        }
        if (b.compareTo(BigDecimal.ZERO) != 1){
            System.out.println("b的取值范圍不正確");
            return;
        }
        System.out.println("do something");
    }

這樣做從功能角度來說一點(diǎn)問題也沒有。

但是從代碼的長期維護(hù)性上來說,代碼復(fù)用率低,校驗規(guī)則一旦多起來很難維護(hù),而且怎么看怎么顯得笨拙,對于有一點(diǎn)追求的工程師來說,這么一大坨還是挺難接受的。

雖然有一些諸如 Preconditions(com.google) 的解決方案,但很難適應(yīng)所有的場景,用起來也沒到非常得心應(yīng)有的地步。

二、如何優(yōu)雅地校驗參數(shù)

Spring官方推薦的,語義清晰的優(yōu)雅的方法級別校驗(入?yún)⑿r?、返回值校驗?/p>

2.1 官方指導(dǎo)意見

Spring官方在SpringBoot文檔中,關(guān)于參數(shù)校驗(Validation)給出的解決方案是這樣的:

@Service
@Validated
public class MyBean {
 
    public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code,
            Author author) {
        ...
    }
 
}

Spring Boot 官網(wǎng)文檔 《37. Validation》

也就是說,使用 JSR-303 規(guī)范,直接利用注解進(jìn)行參數(shù)校驗。

(JSR-303 是 JAVA EE 6 中的一項子規(guī)范,叫做 Bean Validation,官方參考實現(xiàn)是 Hibernate Validator)

2.2 注解用法說明

2.2.1.注解簡介

對于簡單類型參數(shù)(非Bean),直接在參數(shù)前,使用注解添加約束規(guī)則。注解如下所示:

@AssertTrue / @AssertFalse 

驗證適用字段:boolean

注解說明:驗證值是否為true / false

@DecimalMax / @DecimalMin

驗證適用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解說明:驗證值是否小于或者等于指定的小數(shù)值,要注意小數(shù)存在精度問題

@Digits

驗證適用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解說明:驗證值的數(shù)字構(gòu)成是否合法

屬性說明:integer:指定整數(shù)部分的數(shù)字的位數(shù)。fraction: 指定小數(shù)部分的數(shù)字的位數(shù)。

@Future / @Past

驗證適用字段:Date,Calendar

注解說明:驗證值是否在當(dāng)前時間之后 / 之前

屬性說明:公共

@Max / @Min

驗證適用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解說明:驗證值是否小于或者等于指定的整數(shù)值

屬性說明:公共

注意事項:建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單提交的值為“”時無法轉(zhuǎn)換為int

@NotNull / @Null

驗證適用字段:引用數(shù)據(jù)類型

注解說明:驗證值是否為非空 / 空

屬性說明:公共

@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格. 

@NotEmpty 檢查約束元素是否為Null或者是EMPTY.

@NotBlank 與 @NotEmpty 的區(qū)別:空格(" ")對于 NotEmpty 是合法的,而 NotBlank 會拋出校驗異常

@Pattern

驗證適用字段:String

注解說明:驗證值是否配備正則表達(dá)式

屬性說明:regexp:正則表達(dá)式flags: 指定Pattern.Flag 的數(shù)組,表示正則表達(dá)式的相關(guān)選項。

@Size

驗證適用字段:String,Collection,Map,數(shù)組

注解說明:驗證值是否滿足長度要求

屬性說明:max:指定最大長度,min:指定最小長度。

@Length(min=, max=):專門應(yīng)用于String類型

@Valid

驗證適用字段:遞歸的對關(guān)聯(lián)對象進(jìn)行校驗

注解說明:如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗,如果是一個map,則對其中的值部分進(jìn)行校驗(是否進(jìn)行遞歸驗證)

屬性說明:無

@Range(min=, max=) 被指定的元素必須在合適的范圍內(nèi) 

@CreditCardNumber信用卡驗證 

@Email 驗證是否是郵件地址,如果為null,不進(jìn)行驗證,算通過驗證。 

@URL(protocol=,host=, port=,regexp=, flags=)

2.2.2使用

1.引入依賴

 <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.1.5.Final</version>
        </dependency>

2.在對應(yīng)字段上添加注解,方法被調(diào)用時,如果傳入的實際參數(shù)與約束規(guī)則不符,會直接拋出 ConstraintViolationException ,表明參數(shù)校驗失敗。

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
 
/**
 * @Author: wangxia
 * @Date: 2021/10/20 16:30
 */
public class TestPerson {
 
    @NotEmpty(message = "用戶名不能為空")
    private String username;
 
    @Min(value = 0,message = "年齡不能小于0歲")
    @Max(value =150,message = "年齡不能大于150歲")
    private int age;
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}

3..對于Bean類型的參數(shù),在Bean內(nèi)部的各個字段上面追加約束注解,然后在方法的參數(shù)前面添加 @Validated或@Valid注解即可。示例:

@RequestMapping("/")
@RestController
public class TestValidatController {
 
    @PostMapping("/testValid")
    public String testValid(@Validated @RequestBody TestPerson testPerson){
        return "測試成功";
    }
 
}

4.優(yōu)雅捕獲異常,這一步可以省略,但是請求時會直接返回,400的異常提示,不太優(yōu)雅。

@ControllerAdvice
@ResponseBody 
public class MethodArgumentNotValidHandel {
 
 
    @ExceptionHandler(value=MethodArgumentNotValidException.class)
    public JSONObject MethodArgumentNotValidHandler(HttpServletRequest request,
                                                    MethodArgumentNotValidException exception) throws Exception
    {
        JSONObject result=new JSONObject();
        result.put("code","fail");
        JSONObject errorMsg=new JSONObject();
        for (FieldError error : exception.getBindingResult().getFieldErrors()) {
            errorMsg.put(error.getField(),error.getDefaultMessage());
        }
        result.put("msg",errorMsg);
        return result;
    }
 
}

添加優(yōu)雅捕獲的異常提示:

未添加優(yōu)雅捕獲的異常提示:

到此這篇關(guān)于Java實現(xiàn)優(yōu)雅的參數(shù)校驗方法詳解的文章就介紹到這了,更多相關(guān)Java參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis-plus在項目中的簡單應(yīng)用

    Mybatis-plus在項目中的簡單應(yīng)用

    Mybatis-plus是Spring框架中OOM的一大利器,其簡單易用參考官網(wǎng)文檔即可很快上手,本文主要介紹了邏輯刪除,自動填充,分頁插件等的簡單使用,感興趣的可以了解一下
    2021-07-07
  • MongoDB整合Spring實例詳細(xì)講解(含代碼)

    MongoDB整合Spring實例詳細(xì)講解(含代碼)

    這篇文章主要介紹了MongoDB整合Spring實例詳細(xì)講解(含代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 基于Java隨機(jī)生成手機(jī)短信驗證碼的實例代碼

    基于Java隨機(jī)生成手機(jī)短信驗證碼的實例代碼

    這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗證碼的實例代碼,代碼分為哦簡單版和復(fù)雜版,需要的朋友可以參考下
    2019-04-04
  • SpringBoot配置和切換Tomcat流程詳解

    SpringBoot配置和切換Tomcat流程詳解

    這篇文章主要介紹了如何給springboot配置和切換默認(rèn)的Tomcat容器以及相關(guān)的經(jīng)驗技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java使用泛型實現(xiàn)棧結(jié)構(gòu)的示例代碼

    Java使用泛型實現(xiàn)棧結(jié)構(gòu)的示例代碼

    泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用泛型實現(xiàn)簡單的棧結(jié)構(gòu),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • Jenkins Host key verification failed問題解決

    Jenkins Host key verification failed問題解決

    這篇文章主要介紹了Jenkins Host key verification failed問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 淺談java里的EL表達(dá)式在JSP中不能解析的問題

    淺談java里的EL表達(dá)式在JSP中不能解析的問題

    下面小編就為大家?guī)硪黄獪\談java里的EL表達(dá)式在JSP中不能解析的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • spring?cloud?eureka?服務(wù)啟動失敗的原因分析及解決方法

    spring?cloud?eureka?服務(wù)啟動失敗的原因分析及解決方法

    這篇文章主要介紹了spring?cloud?eureka?服務(wù)啟動失敗的原因解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • SpringCloud?Feign超詳細(xì)講解

    SpringCloud?Feign超詳細(xì)講解

    Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端;?Ribbon負(fù)載均衡、?Hystrⅸ服務(wù)熔斷是我們Spring?Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似
    2022-10-10
  • SpringBoot自定義starter實例代碼

    SpringBoot自定義starter實例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot自定義starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論

繁峙县| 虞城县| 光泽县| 常德市| 盐山县| 十堰市| 宕昌县| 塔城市| 阳江市| 广饶县| 浑源县| 湖南省| 抚远县| 兴山县| 彭阳县| 玛纳斯县| 昆山市| 大英县| 湘阴县| 南阳市| 四子王旗| 长葛市| 永福县| 田东县| 乃东县| 社会| 清水河县| 平罗县| 南陵县| 定远县| 威海市| 奉节县| 布拖县| 会同县| 淮安市| 定州市| 平昌县| 古蔺县| 漳州市| 大宁县| 阳江市|