解決@Validated對(duì)List對(duì)象驗(yàn)證失效問(wèn)題
@Validated對(duì)List對(duì)象驗(yàn)證失效
在實(shí)際開發(fā)中,常常會(huì)對(duì)接口api入?yún)⒆龈袷津?yàn)證,有些入?yún)⑹荓ist數(shù)組對(duì)象。
public ApiResponse receiveManualTranscoding(@Validated @RequestBody List<SdZmDto> sdZmDtos)
其實(shí)這樣是失效的,會(huì)發(fā)現(xiàn)其SdZmDto并不會(huì)進(jìn)行驗(yàn)證。
因?yàn)锧Validated參數(shù)只能驗(yàn)證單個(gè)對(duì)象。
解決方法1
手動(dòng)對(duì)每一個(gè)參數(shù)對(duì)象進(jìn)行做驗(yàn)證,但是代碼會(huì)顯得冗余
private ResultVo validate(@Valid SdZmDto gwbaDto) {
Set<ConstraintViolation<@Valid SdZmDto >> validateSet = Validation.buildDefaultValidatorFactory()
.getValidator()
.validate(gwbaDto);
if (!CollectionUtils.isEmpty(validateSet)) {
String messages = validateSet.stream()
.map(ConstraintViolation::getMessage)
.reduce((m1, m2) -> m1 + ";" + m2)
.orElse("參數(shù)輸入有誤!");
return ResultVo.builder().code(ResultConstants.FALSE).message(SYSTEM_ERROR_TSBAMESSAGE + messages).build();
}
return null;
}
解決方法2
定義一個(gè)對(duì)象,將list封裝進(jìn)行,則驗(yàn)證就驗(yàn)證單個(gè)對(duì)象了。
@Data
public class ValidList<E> implements List<E> {
@Valid
private List<E> list = new ArrayList<>();
}
將 public ApiResponse receiveManualTranscoding(@Validated @RequestBody List<SdZmDto> sdZmDtos)
改成
public ApiResponse receiveManualTranscoding(@Validated @RequestBody ValidList<SdZmDto> sdZmDtos)
選擇方案
解決方法1雖然冗余代碼,但是符合需求,如果采用方法2,則需要將請(qǐng)求的json參數(shù)進(jìn)行做調(diào)整。
@PostMapping("/receiveManualTranscoding")
@ResponseBody
public ApiResponse receiveManualTranscoding(@RequestBody List<SdZmDto> sdZmDtos) {
for(SdZmDto sdZmDto : sdZmDtos){
ApiResponse apiResponse = null;
if((apiResponse = validate(sdZmDto)) != null){
return apiResponse;
}
}
ajmApiService.receiveManualTranscoding(sdZmDtos);
return ApiDataResponse.ofSuccess();
}
private ApiResponse validate(@Valid SdZmDto sdZmDto) {
Set<ConstraintViolation<@Valid SdZmDto >> validateSet = Validation.buildDefaultValidatorFactory()
.getValidator()
.validate(sdZmDto);
if (!CollectionUtils.isEmpty(validateSet)) {
String messages = validateSet.stream()
.map(ConstraintViolation::getMessage)
.reduce((m1, m2) -> m1 + ";" + m2)
.orElse("參數(shù)輸入有誤!");
return ApiResponse.ofFail(messages);
}
return null;
}
```
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot短信驗(yàn)證碼登錄功能的實(shí)現(xiàn)
這篇文章主要介紹了springboot短信驗(yàn)證碼登錄功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Java Callable接口實(shí)現(xiàn)細(xì)節(jié)詳解
這篇文章主要介紹了Java Callable接口實(shí)現(xiàn)細(xì)節(jié)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
在Springboot中Mybatis與Mybatis-plus的區(qū)別詳解
MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC的操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,MyBatisPlus (簡(jiǎn)稱 MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,本文將給大家介紹了在Springboot中Mybatis與Mybatis-plus的區(qū)別2023-12-12
Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)
今天小編就為大家分享一篇關(guān)于Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的工廠方法模式和抽象工廠模式,設(shè)計(jì)模式的建立有利于團(tuán)隊(duì)協(xié)作時(shí)代碼的共同維護(hù),需要的朋友可以參考下2016-01-01
Java中?equals?重寫時(shí)為什么一定也要重寫?hashCode
這篇文章主要介紹了Java中?equals?重寫時(shí)為什么一定也要重寫?hashCode,equals?方法和?hashCode?方法是?Object?類中的兩個(gè)基礎(chǔ)方法,它們共同協(xié)作來(lái)判斷兩個(gè)對(duì)象是否相等,所以之間到底有什么聯(lián)系呢,接下來(lái)和小編一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧2022-05-05
Spring很常用的@Conditional注解的使用場(chǎng)景和源碼解析
今天要分享的是Spring的注解@Conditional,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,本文詳細(xì)介紹了@Conditional注解的使用場(chǎng)景和源碼,需要的朋友可以參考一下2023-04-04
Java線程池必知必會(huì)知識(shí)點(diǎn)總結(jié)
這篇文章主要給大家介紹了關(guān)于Java線程池必知必會(huì)知識(shí)點(diǎn)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程詳解
在我們向客戶銷售商業(yè)軟件的時(shí)候,常常需要對(duì)所發(fā)布的軟件實(shí)行一系列管控措施,諸如驗(yàn)證使用者身份、軟件是否到期,以及保存版權(quán)信息和開發(fā)商詳情等,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程,需要的朋友可以參考下2024-09-09

