欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

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

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

問題背景

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

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

原因分析

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

controller如下:

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

Form如下:

public class AForm {

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

    private List<ASubForm> updateList;
}

public class ASubForm {

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

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

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

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

問題

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

解決方案

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

public class AForm {

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

 	@Valid
    private List<ASubForm> updateList;
}

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

例如:

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

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

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

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

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

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

首先,創(chuàng)建一個自定義的校驗(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)每個元素
            // ...
        }

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

然后,創(chuàng)建一個自定義的注解來應(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對象校驗(yàn)的地方使用該注解:

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

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

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

另一種方法是手動遞歸校驗(yàn)嵌套的List對象。您可以在校驗(yàn)對象的方法中,手動對List對象的每個元素應(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)錯誤
        }
    }
}

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

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

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

總結(jié)

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

相關(guān)文章

  • 關(guān)于JavaEE內(nèi)部類的部分注意事項(xiàng)

    關(guān)于JavaEE內(nèi)部類的部分注意事項(xiàng)

    這篇文章主要介紹了關(guān)于JavaEE內(nèi)部類的部分注意事項(xiàng),將一個類定義在另一個類里面或者一個方法里面,這樣的類稱為內(nèi)部類,這是一種封裝思想,那么使用內(nèi)部類的時候要注意些什么呢,讓我們一起來看看吧
    2023-03-03
  • Java超詳細(xì)透徹講解接口

    Java超詳細(xì)透徹講解接口

    接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java接口,感興趣的朋友一起看看吧
    2022-05-05
  • 23種設(shè)計(jì)模式(20)java中介者模式

    23種設(shè)計(jì)模式(20)java中介者模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java中介者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring定時任務(wù)并行(異步)處理方式

    Spring定時任務(wù)并行(異步)處理方式

    這篇文章主要介紹了Spring定時任務(wù)并行(異步)處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java設(shè)計(jì)模式之開閉原則精解

    Java設(shè)計(jì)模式之開閉原則精解

    設(shè)計(jì)模式(Design?pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設(shè)計(jì)模式七大原則之一的開閉原則
    2022-02-02
  • Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之下載功能(2)

    Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之下載功能(2)

    這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼

    SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼

    作為分布式項(xiàng)目,單點(diǎn)登錄是必不可少的,這篇文章主要介紹了SpringCloud實(shí)現(xiàn)SSO 單點(diǎn)登錄的示例代碼,非常具有實(shí)用價值,需要的朋友可以參考下
    2019-01-01
  • java策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢

    java策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢

    這篇文章主要給大家介紹了關(guān)于Java徹底消滅if-else的8種方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2021-06-06
  • 雪花算法(snowflak)生成有序不重復(fù)ID的Java實(shí)現(xiàn)代碼

    雪花算法(snowflak)生成有序不重復(fù)ID的Java實(shí)現(xiàn)代碼

    雪花算法是一種分布式系統(tǒng)中生成唯一ID的方法,由41位時間戳、10位機(jī)器碼和12位序列號組成,具有唯一性、有序性和高效率等優(yōu)點(diǎn),這篇文章主要介紹了雪花算法(snowflak)生成有序不重復(fù)ID的Java實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-11-11
  • Mybatis中動態(tài)SQL,if,where,foreach的使用教程詳解

    Mybatis中動態(tài)SQL,if,where,foreach的使用教程詳解

    MyBatis的動態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯。這篇文章主要介紹了Mybatis中動態(tài)SQL,if,where,foreach的使用教程,需要的朋友可以參考下
    2017-11-11

最新評論