如何解決@Valid對象嵌套List對象校驗無效問題
引言
在使用Spring框架進行數(shù)據(jù)校驗時,有時會遇到@Valid注解無法校驗嵌套的List對象的情況。
本文將介紹這個問題的原因,并提供解決方案,幫助您有效地校驗嵌套的List對象。
問題背景
Spring框架提供了基于注解的數(shù)據(jù)校驗功能,其中@Valid注解用于標記需要進行校驗的對象。
然而,當對象中包含嵌套的List對象時,外層使用@Valid注解無法對嵌套的List對象進行校驗。
原因分析
默認情況下,Spring框架對嵌套對象的校驗支持較好,但對于嵌套的List對象,@Valid注解并不會自動遞歸進行校驗。
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 = "離港機場必選") private String DepAirport; @NotBlank(message = "目的機場必選") private String ArrAirport; }
問題
controller調用的時候只有外層的updateTime有提示數(shù)據(jù)更新時間必填,航班號航班日期等為空都不進行校驗。
解決方案
修改AForm,在list對象上加上注解 @Valid就能正常校驗了
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框架進行數(shù)據(jù)校驗時,可以在嵌套的List對象上添加@Valid注解,以啟用對嵌套對象的遞歸校驗。這樣,Spring框架會自動對List中的每個元素應用校驗規(guī)則。
例如:
public class YourClass { @Valid private List<YourNestedClass> nestedList; // 其他屬性和方法 }
通過在List對象上添加@Valid注解,Spring框架會自動遞歸校驗嵌套對象,并將校驗結果返回。
這種方式是更簡便的解決方案,可以避免手動遞歸校驗或自定義注解和校驗器。建議優(yōu)先考慮在嵌套的List對象上使用@Valid注解來實現(xiàn)校驗。
除了使用@Valid注解,還有其他方法可以對嵌套的List對象進行校驗。以下是一些備選方案:
1.使用自定義校驗器
您可以編寫自定義的校驗器來處理嵌套的List對象。自定義校驗器可以實現(xiàn)對List中每個元素的校驗邏輯,并進行遞歸校驗。
首先,創(chuàng)建一個自定義的校驗器類:
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; // 空列表不進行校驗 } // 執(zhí)行自定義的校驗邏輯 for (Object element : list) { // 校驗每個元素 // ... } return true; // 校驗通過 } }
然后,創(chuàng)建一個自定義的注解來應用該校驗器:
@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 {}; }
最后,在需要進行嵌套List對象校驗的地方使用該注解:
public class YourClass { @ValidList private List<YourNestedClass> nestedList; // 其他屬性和方法 }
通過自定義校驗器和注解,您可以實現(xiàn)對嵌套的List對象的校驗邏輯。
2.手動遞歸校驗
另一種方法是手動遞歸校驗嵌套的List對象。您可以在校驗對象的方法中,手動對List對象的每個元素應用校驗規(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); // 處理校驗錯誤 } } }
通過手動遞歸校驗List對象的每個元素,您可以實現(xiàn)對嵌套的List對象的校驗。
這些是一些可選的方法,可用于對嵌套的List對象進行校驗。您可以根據(jù)具體需求和情況選擇適合您的解決方案。
請注意,以上方法也可以與@Valid注解結合使用,以實現(xiàn)更全面的校驗。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java語言實現(xiàn)簡單FTP軟件 FTP軟件效果圖預覽之下載功能(2)
這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP軟件效果圖預覽之下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03SpringCloud實現(xiàn)SSO 單點登錄的示例代碼
作為分布式項目,單點登錄是必不可少的,這篇文章主要介紹了SpringCloud實現(xiàn)SSO 單點登錄的示例代碼,非常具有實用價值,需要的朋友可以參考下2019-01-01java策略枚舉:消除在項目里大批量使用if-else的優(yōu)雅姿勢
這篇文章主要給大家介紹了關于Java徹底消滅if-else的8種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2021-06-06雪花算法(snowflak)生成有序不重復ID的Java實現(xiàn)代碼
雪花算法是一種分布式系統(tǒng)中生成唯一ID的方法,由41位時間戳、10位機器碼和12位序列號組成,具有唯一性、有序性和高效率等優(yōu)點,這篇文章主要介紹了雪花算法(snowflak)生成有序不重復ID的Java實現(xiàn)的相關資料,需要的朋友可以參考下2024-11-11Mybatis中動態(tài)SQL,if,where,foreach的使用教程詳解
MyBatis的動態(tài)SQL是基于OGNL表達式的,它可以幫助我們方便的在SQL語句中實現(xiàn)某些邏輯。這篇文章主要介紹了Mybatis中動態(tài)SQL,if,where,foreach的使用教程,需要的朋友可以參考下2017-11-11