解決@Validated對(duì)List對(duì)象驗(yàn)證失效問(wèn)題
@Validated對(duì)List對(duì)象驗(yàn)證失效
在實(shí)際開(kāi)發(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)文章
解決JavaEE開(kāi)發(fā)中字符編碼出現(xiàn)亂碼的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決JavaEE開(kāi)發(fā)中字符編碼出現(xiàn)亂碼的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
教你怎么用Java數(shù)組和鏈表實(shí)現(xiàn)棧
本篇文章為大家詳細(xì)介紹了怎么用Java數(shù)組和鏈表實(shí)現(xiàn)棧,文中有非常詳細(xì)的代碼示例及注釋,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Mac系統(tǒng)上安裝?JDK?8?最穩(wěn)最全教程(Homebrew?方式)
Homebrew是一個(gè)開(kāi)源的包管理器,專(zhuān)為macOS(盡管也可以在Linux上使用)設(shè)計(jì),用來(lái)簡(jiǎn)化在Mac操作系統(tǒng)上安裝軟件的過(guò)程,這篇文章主要介紹了Mac系統(tǒng)上使用Homebrew方式安裝JDK8最穩(wěn)最全教程的相關(guān)資料,需要的朋友可以參考下2026-04-04
Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫(xiě)詳細(xì)代碼示例
這篇文章主要為大家詳細(xì)介紹了Mybatis中動(dòng)態(tài)SQL的編寫(xiě)使用,動(dòng)態(tài)SQL技術(shù)是一種根據(jù)特定條件動(dòng)態(tài)拼裝SQL語(yǔ)句的功能,它存在的意義是為了解決拼接SQL語(yǔ)句字符串時(shí)的痛點(diǎn)問(wèn)題,感興趣想要詳細(xì)了解可以參考下文2023-05-05
MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼
這篇文章主要介紹了MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android/Java中創(chuàng)建類(lèi)實(shí)例的各種模式實(shí)例代碼
這篇文章主要介紹了Android/Java中創(chuàng)建類(lèi)實(shí)例各種模式的相關(guān)資料,包括New關(guān)鍵字、靜態(tài)工廠(chǎng)方法、建造者模式、單例模式、依賴(lài)注入、抽象工廠(chǎng)模式、原型模式和Reflection,每個(gè)模式有其特點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下2025-09-09
springmvc學(xué)習(xí)筆記-返回json的日期格式問(wèn)題的解決方法
本篇文章主要介紹了springmvc學(xué)習(xí)筆記-返回json的日期格式問(wèn)題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。2017-01-01
SpringBoot中的配置文件加載優(yōu)先級(jí)詳解
這篇文章主要介紹了SpringBoot中的配置文件加載優(yōu)先級(jí)詳解,springboot啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml文件作為Spring?boot的默認(rèn)配置文件,需要的朋友可以參考下2024-01-01
springboot實(shí)現(xiàn)發(fā)送QQ郵箱
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送QQ郵箱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

