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

Spring Validation的校驗順序問題及解決過程

 更新時間:2026年01月09日 09:19:23   作者:她又在叢中笑  
本文主要介紹了使用@GroupSequence注解來解決接口入?yún)⑿r烅樞虿环€(wěn)定的問題,并提供了具體的實現(xiàn)步驟和代碼示例

問題場景

測試發(fā)現(xiàn)對同一個接口調(diào)用多次時,返回的校驗異常信息不同,經(jīng)過問題追蹤,入?yún)嶓w類代碼如下:

@Data
public class EditDevNameDto {
    @NotBlank(message = "deviceSn must not null")
    private String deviceSn;
    @NotBlank(message = "deviceName must not null")
    private String deviceName;
}

當這個接口入?yún)⒌膁eviceSn和deviceName均為空值時,調(diào)用多次的話會出現(xiàn)兩個msg錯誤信息循環(huán)返回的問題。

原理剖析

懷疑是調(diào)用接口時,校驗注解的先后順序是不確定的,所以,可能deviceSn先被校驗,可能deviceName先被校驗,那要解決這個問題就要規(guī)定校驗的順序才行。

解決方法

使用@GroupSequence注解實現(xiàn)順序的穩(wěn)定性。

創(chuàng)建五個接口

public interface GroupA {
}

public interface GroupB {
}

public interface GroupC {
}

public interface GroupD {
}

@GroupSequence({GroupA.class,GroupB.class,GroupC.class,GroupD.class})
public interface Group {
}

修改Controller控制層代碼

注意在入?yún)⒅屑尤隌Validated(Group.class)注解,其中要加入被@GroupSequence修飾的類對象。

    @PostMapping("/edit_device_name")
    public ExecuteResult editDevName(
    	@RequestBody @Validated(Group.class) EditDevNameDto dev) {
        // -----邏輯代碼
        return null;
    }

修改實體類代碼

在實體類中使用校驗注解中添加groups屬性,順序按照@GroupSequence類規(guī)定的順序即可。

@Data
public class EditDevNameDto {
    @NotBlank(message = "deviceSn must not null", groups = {GroupA.class})
    private String deviceSn;
    @NotBlank(message = "deviceName must not null", groups = {GroupB.class})
    private String deviceName;
}

整改結(jié)果

當這個接口入?yún)⒌膁eviceSn和deviceName均為空值時,頻繁調(diào)用依然是按照先校驗deviceSn,后校驗deviceName的順序進行參數(shù)校驗。

后續(xù)問題

問題原因

解決了上面的問題,過了幾天,又出現(xiàn)了解決校驗順序的問題,但是這次又不同于上一次,這次的Dto參數(shù)接收類有些復(fù)雜,代碼如下:

@Data
public class UpdateInfoDto {

    @NotBlank(message = "deviceSn can not be empty")
    @GBDeviceSnValid
    private String deviceSn;


    @Valid // 讓CommonDto類中的校驗屬性生效
    @GBChannelDuplicateValid
    @CollectionNotEmptyValid(message = "channels cannot be empty")
    private List<CommonDto> channels;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonDto{

    @GBChannelIdValid
    private String id;

    @NotNull(message = "channelId must not be null")
    @PositiveOrZero(message = "channelId only Integer or zero")
    private Integer channelId;
}

以上代碼中有兩個類,共同組合成參數(shù)接收類,要糾正校驗順序混亂問題,還是需要用到一開始講到的@GroupSequence注解,但是,有兩個問題:

  1. Dto中還有一個對象類型的屬性。
  2. 對象類型屬性中的子屬性(id、channelId)也要成功校驗

解決方案

首先,為了讓Dto中的對象類型的屬性也能正常校驗,需要添加@Valid注解;

然后,在對象類型屬性中的子屬性中也需要像文章前面所說的在校驗注解中設(shè)置groups屬性。

修改后的代碼如下:

@Data
public class UpdateInfoDto {

    @NotBlank(message = "deviceSn can not be empty", groups = {GroupA.class})
    @GBDeviceSnValid(groups = {GroupA.class})
    private String deviceSn;


    @Valid // 讓CommonDto類中的校驗屬性生效
    @GBChannelDuplicateValid(groups = {GroupB.class})
    @CollectionNotEmptyValid(message = "channels cannot be empty", groups = {GroupB.class})
    private List<CommonDto> channels;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonDto{

    @GBChannelIdValid(groups = {GroupC.class})
    private String id;

    @NotNull(message = "channelId must not be null", groups = {GroupD.class})
    @PositiveOrZero(message = "channelId only Integer or zero", groups = {GroupD.class})
    private Integer channelId;
}

如果CommonDto中校驗屬性的注解不設(shè)置groups,CommonDto中的校驗屬性就會失效,這是個大坑。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)學(xué)生信息錄入界面

    java實現(xiàn)學(xué)生信息錄入界面

    這篇文章主要為大家詳細介紹了java實現(xiàn)學(xué)生信息錄入界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springboot 緩存@EnableCaching實例

    springboot 緩存@EnableCaching實例

    這篇文章主要介紹了springboot 緩存@EnableCaching實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Mybatis中使用萬能的Map傳參實現(xiàn)

    Mybatis中使用萬能的Map傳參實現(xiàn)

    在編程中,有可能遇到我們的實體類或者數(shù)據(jù)庫中表的字段或參數(shù)過多的情況,那這時候用Map傳參是比較理想的選擇,本文就詳細的介紹一下如何使用,感興趣的可以了解下
    2021-07-07
  • 深入理解窗口令牌WindowToken

    深入理解窗口令牌WindowToken

    這篇文章主要介紹了窗口令牌WindowToken的概念與作用,它是對應(yīng)用組件的行為進行規(guī)范管理的一個手段。WindowToken由應(yīng)用組件或其管理者負責(zé)向WMS聲明并持有
    2021-08-08
  • Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能

    Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能

    這篇文章主要為大家詳細介紹了Java網(wǎng)絡(luò)編程TCP實現(xiàn)聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 一文揭秘Java內(nèi)存模型的隱匿陷阱與解決方案

    一文揭秘Java內(nèi)存模型的隱匿陷阱與解決方案

    這篇文章主要為大家詳細介紹了Java中內(nèi)存模型的隱匿陷阱與解決方案,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06
  • Java JUC并發(fā)集合詳解之線程安全容器完全攻略

    Java JUC并發(fā)集合詳解之線程安全容器完全攻略

    Java通過java.util.concurrent(JUC)包提供了一整套線程安全的并發(fā)容器,它們不僅是簡單的同步包裝,更是基于精妙并發(fā)算法構(gòu)建的高性能工具,本文給大家介紹Java JUC并發(fā)集合詳解之線程安全容器完全攻略,感興趣的朋友一起看看吧
    2025-09-09
  • SpringBoot源碼閱讀之spring.factories的加載機制詳解

    SpringBoot源碼閱讀之spring.factories的加載機制詳解

    Spring Boot通過`spring.factories`文件實現(xiàn)自動裝配,該文件位于`META-INF`目錄下,Spring Boot在啟動時會讀取該文件并實例化其中配置的實現(xiàn)類
    2025-11-11
  • MyBatis延遲加載與多級緩存全解析

    MyBatis延遲加載與多級緩存全解析

    文章介紹MyBatis的延遲加載與多級緩存機制,延遲加載按需加載關(guān)聯(lián)數(shù)據(jù)提升性能,一級緩存會話級默認開啟,二級緩存工廠級支持跨會話共享,增刪改操作會清空對應(yīng)緩存,確保數(shù)據(jù)一致性,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Java中如何編寫一個數(shù)的n次方(冪運算)?

    Java中如何編寫一個數(shù)的n次方(冪運算)?

    本文介紹了使用pow函數(shù)和自定義for循環(huán)計算冪的O(n)時間復(fù)雜度方法,然后重點講解了快速冪算法的分治思想,以及從二進制角度的解釋,包括如何通過位運算和循環(huán)迭代實現(xiàn)高效計算,給出了Java代碼實現(xiàn)
    2024-07-07

最新評論

九龙坡区| 北海市| 建昌县| 新干县| 车致| 黑龙江省| 达州市| 沧州市| 赤峰市| 临泽县| 蛟河市| 双柏县| 宝兴县| 大港区| 额敏县| 永胜县| 兖州市| 高淳县| 若尔盖县| 淮安市| 克拉玛依市| 东山县| 阿拉尔市| 宁强县| 南陵县| 丰顺县| 和田县| 海晏县| 渝中区| 墨玉县| 徐汇区| 安陆市| 响水县| 临洮县| 和林格尔县| 绥宁县| 缙云县| 巨鹿县| 鄯善县| 临邑县| 五峰|