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

如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題

 更新時(shí)間:2024年07月11日 09:29:54   作者:Thomas & Friends  
這篇文章主要介紹了如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

引言

在使用Spring框架進(jìn)行數(shù)據(jù)校驗(yàn)時(shí),有時(shí)會(huì)遇到@Valid注解無(wú)法校驗(yàn)嵌套的List對(duì)象的情況。

本文將介紹這個(gè)問(wèn)題的原因,并提供解決方案,幫助您有效地校驗(yàn)嵌套的List對(duì)象。

問(wèn)題背景

Spring框架提供了基于注解的數(shù)據(jù)校驗(yàn)功能,其中@Valid注解用于標(biāo)記需要進(jìn)行校驗(yàn)的對(duì)象。

然而,當(dāng)對(duì)象中包含嵌套的List對(duì)象時(shí),外層使用@Valid注解無(wú)法對(duì)嵌套的List對(duì)象進(jìn)行校驗(yàn)。

原因分析

默認(rèn)情況下,Spring框架對(duì)嵌套對(duì)象的校驗(yàn)支持較好,但對(duì)于嵌套的List對(duì)象,@Valid注解并不會(huì)自動(dòng)遞歸進(jìn)行校驗(yàn)。

controller如下:

public Objects flights(@RequestBody @Valid AForm aForm){
        return null;
    }

Form如下:

public class AForm {

    @NotNull(message = "數(shù)據(jù)更新時(shí)間必選")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private Date updateTime;

    private List<ASubForm> updateList;
}

public class ASubForm {

    @NotBlank(message = "航班號(hào)必選")
    private String FlightNumber;

    @NotBlank(message = "航班日期必選")
    private String FlightDate;

    @NotBlank(message = "離港機(jī)場(chǎng)必選")
    private String DepAirport;

    @NotBlank(message = "目的機(jī)場(chǎng)必選")
    private String ArrAirport;
}

問(wèn)題

controller調(diào)用的時(shí)候只有外層的updateTime有提示數(shù)據(jù)更新時(shí)間必填,航班號(hào)航班日期等為空都不進(jìn)行校驗(yàn)。

解決方案

修改AForm,在list對(duì)象上加上注解 @Valid就能正常校驗(yàn)了

public class AForm {

    @NotNull(message = "數(shù)據(jù)更新時(shí)間必選")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
    private Date updateTime;

 	@Valid
    private List<ASubForm> updateList;
}

在使用Spring框架進(jìn)行數(shù)據(jù)校驗(yàn)時(shí),可以在嵌套的List對(duì)象上添加@Valid注解,以啟用對(duì)嵌套對(duì)象的遞歸校驗(yàn)。這樣,Spring框架會(huì)自動(dòng)對(duì)List中的每個(gè)元素應(yīng)用校驗(yàn)規(guī)則。

例如:

public class YourClass {
    @Valid
    private List<YourNestedClass> nestedList;
    // 其他屬性和方法
}

通過(guò)在List對(duì)象上添加@Valid注解,Spring框架會(huì)自動(dòng)遞歸校驗(yàn)嵌套對(duì)象,并將校驗(yàn)結(jié)果返回。

這種方式是更簡(jiǎn)便的解決方案,可以避免手動(dòng)遞歸校驗(yàn)或自定義注解和校驗(yàn)器。建議優(yōu)先考慮在嵌套的List對(duì)象上使用@Valid注解來(lái)實(shí)現(xiàn)校驗(yàn)。

除了使用@Valid注解,還有其他方法可以對(duì)嵌套的List對(duì)象進(jìn)行校驗(yàn)。以下是一些備選方案:

1.使用自定義校驗(yàn)器

您可以編寫自定義的校驗(yàn)器來(lái)處理嵌套的List對(duì)象。自定義校驗(yàn)器可以實(shí)現(xiàn)對(duì)List中每個(gè)元素的校驗(yàn)邏輯,并進(jìn)行遞歸校驗(yàn)。

首先,創(chuàng)建一個(gè)自定義的校驗(yàn)器類:

public class ListValidator implements ConstraintValidator<ValidList, List<?>> {
    @Override
    public void initialize(ValidList constraintAnnotation) {
    }

    @Override
    public boolean isValid(List<?> list, ConstraintValidatorContext context) {
        if (list == null || list.isEmpty()) {
            return true; // 空列表不進(jìn)行校驗(yàn)
        }

        // 執(zhí)行自定義的校驗(yàn)邏輯
        for (Object element : list) {
            // 校驗(yàn)每個(gè)元素
            // ...
        }

        return true; // 校驗(yàn)通過(guò)
    }
}

然后,創(chuàng)建一個(gè)自定義的注解來(lái)應(yīng)用該校驗(yàn)器:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ListValidator.class)
public @interface ValidList {
    String message() default "Invalid list";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

最后,在需要進(jìn)行嵌套List對(duì)象校驗(yàn)的地方使用該注解:

public class YourClass {
    @ValidList
    private List<YourNestedClass> nestedList;
    // 其他屬性和方法
}

通過(guò)自定義校驗(yàn)器和注解,您可以實(shí)現(xiàn)對(duì)嵌套的List對(duì)象的校驗(yàn)邏輯。

2.手動(dòng)遞歸校驗(yàn)

另一種方法是手動(dòng)遞歸校驗(yàn)嵌套的List對(duì)象。您可以在校驗(yàn)對(duì)象的方法中,手動(dòng)對(duì)List對(duì)象的每個(gè)元素應(yīng)用校驗(yàn)規(guī)則。

public class YourClass {
    private List<@Valid YourNestedClass> nestedList;
    // 其他屬性和方法

    public void validate() {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        for (YourNestedClass element : nestedList) {
            Set<ConstraintViolation<YourNestedClass>> violations = validator.validate(element);
            // 處理校驗(yàn)錯(cuò)誤
        }
    }
}

通過(guò)手動(dòng)遞歸校驗(yàn)List對(duì)象的每個(gè)元素,您可以實(shí)現(xiàn)對(duì)嵌套的List對(duì)象的校驗(yàn)。

這些是一些可選的方法,可用于對(duì)嵌套的List對(duì)象進(jìn)行校驗(yàn)。您可以根據(jù)具體需求和情況選擇適合您的解決方案。

請(qǐng)注意,以上方法也可以與@Valid注解結(jié)合使用,以實(shí)現(xiàn)更全面的校驗(yàn)。

總結(jié)

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

相關(guān)文章

  • java項(xiàng)目中多線程使用場(chǎng)景與實(shí)現(xiàn)方式詳解

    java項(xiàng)目中多線程使用場(chǎng)景與實(shí)現(xiàn)方式詳解

    在項(xiàng)目中,多線程的使用非常廣泛,主要用于提高程序的并發(fā)性和響應(yīng)速度,本文為大家整理了一些常見的多線程使用場(chǎng)景以及相應(yīng)的實(shí)現(xiàn)方式,希望對(duì)大家有一定的幫助
    2025-04-04
  • Java實(shí)現(xiàn)二分搜索樹的示例代碼

    Java實(shí)現(xiàn)二分搜索樹的示例代碼

    二分搜索樹是一顆二叉樹,二分搜索樹每個(gè)節(jié)點(diǎn)的左子樹的值都小于該節(jié)點(diǎn)的值,每個(gè)節(jié)點(diǎn)右子樹的值都大于該節(jié)點(diǎn)的值。本文將利用Java實(shí)現(xiàn)二分搜索樹,需要的可以參考一下
    2022-03-03
  • 史上最簡(jiǎn)單的MyBatis動(dòng)態(tài)SQL入門示例代碼

    史上最簡(jiǎn)單的MyBatis動(dòng)態(tài)SQL入門示例代碼

    動(dòng)態(tài)sql,可以根據(jù)用戶對(duì)字段選擇和輸入,動(dòng)態(tài)生成一條sql執(zhí)行。接下來(lái)通過(guò)本文給大家分享MyBatis動(dòng)態(tài)SQL入門示例代碼,一起看看吧
    2017-03-03
  • List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例

    List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例

    下面小編就為大家?guī)?lái)一篇List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Maven pom.xml scope屬性的使用

    Maven pom.xml scope屬性的使用

    在Maven中,scope屬性用于定義依賴關(guān)系在不同生命周期階段的行為,影響依賴在構(gòu)建過(guò)程中的下載和使用,以及是否傳遞給其他項(xiàng)目,常見的scope值包括compile、provided、runtime和test等
    2025-01-01
  • mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在

    mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在

    這篇文章主要介紹了mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在,具有很好的參考價(jià)值,希望對(duì)的有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java并發(fā)內(nèi)存模型詳情

    Java并發(fā)內(nèi)存模型詳情

    這篇文章主要介紹了Java并發(fā)內(nèi)存模型,Java是一門支持多線程執(zhí)行的語(yǔ)言,要編寫正確的并發(fā)程序,了解Java內(nèi)存模型是重要前提。而了解硬件內(nèi)存模型有助于理解程序的執(zhí)行,下面文章就來(lái)看看詳細(xì)內(nèi)容吧
    2021-10-10
  • MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增)

    MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增)

    本文主要介紹了MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 最長(zhǎng)公共子序列問(wèn)題的深度分析與Java實(shí)現(xiàn)方式

    最長(zhǎng)公共子序列問(wèn)題的深度分析與Java實(shí)現(xiàn)方式

    本文詳細(xì)介紹了最長(zhǎng)公共子序列(LCS)問(wèn)題,包括其概念、暴力解法、動(dòng)態(tài)規(guī)劃解法,并提供了Java代碼實(shí)現(xiàn),暴力解法雖然簡(jiǎn)單,但在大數(shù)據(jù)處理中效率較低,動(dòng)態(tài)規(guī)劃解法通過(guò)構(gòu)建DP表,顯著提高了計(jì)算效率,適用于大規(guī)模數(shù)據(jù)處理
    2025-02-02
  • 詳細(xì)總結(jié)各種排序算法(Java實(shí)現(xiàn))

    詳細(xì)總結(jié)各種排序算法(Java實(shí)現(xiàn))

    下面小編就為大家?guī)?lái)一篇詳細(xì)總結(jié)各種排序算法(Java實(shí)現(xiàn))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09

最新評(píng)論

青神县| 任丘市| 富锦市| 诸城市| 长治市| 三江| 新沂市| 石楼县| 太原市| 乌恰县| 新沂市| 和平区| 新营市| 金秀| 宣威市| 平和县| 大丰市| 富锦市| 大理市| 赤水市| 闸北区| 丹棱县| 佛教| 崇仁县| 神池县| 枣阳市| 青浦区| 泌阳县| 荃湾区| 泰兴市| 宁远县| 泰州市| 马鞍山市| 元阳县| 台中市| 巴林右旗| 涟源市| 百色市| 安岳县| 金昌市| 双辽市|