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

Spring Validation的校驗(yàn)順序問(wèn)題及解決過(guò)程

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

問(wèn)題場(chǎng)景

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

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

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

原理剖析

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

解決方法

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

創(chuàng)建五個(gè)接口

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修飾的類對(duì)象。

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

修改實(shí)體類代碼

在實(shí)體類中使用校驗(yàn)注解中添加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é)果

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

后續(xù)問(wèn)題

問(wèn)題原因

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

@Data
public class UpdateInfoDto {

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


    @Valid // 讓CommonDto類中的校驗(yàn)屬性生效
    @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;
}

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

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

解決方案

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

然后,在對(duì)象類型屬性中的子屬性中也需要像文章前面所說(shuō)的在校驗(yàn)注解中設(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類中的校驗(yàn)屬性生效
    @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中校驗(yàn)屬性的注解不設(shè)置groups,CommonDto中的校驗(yàn)屬性就會(huì)失效,這是個(gè)大坑。

總結(jié)

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

相關(guān)文章

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

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

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

    springboot 緩存@EnableCaching實(shí)例

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

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

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

    深入理解窗口令牌WindowToken

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

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

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

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

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

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

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

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

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

    MyBatis延遲加載與多級(jí)緩存全解析

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

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

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

最新評(píng)論

拜泉县| 宁南县| 贵溪市| 太原市| 库尔勒市| 渭源县| 湘乡市| 莱州市| 贺州市| 阜康市| 班玛县| 太原市| 新宁县| 丹寨县| 平南县| 衡南县| 杂多县| 汝州市| 邵东县| 门头沟区| 吉安县| 沁水县| 宁波市| 大厂| 祥云县| 土默特右旗| 时尚| 西平县| 堆龙德庆县| 临夏县| 基隆市| 抚松县| 山丹县| 长兴县| 乐清市| 潜江市| 万安县| 太和县| 宿迁市| 双柏县| 海伦市|