springboot @Valid注解對(duì)嵌套類型的校驗(yàn)功能
@Valid注解可以實(shí)現(xiàn)數(shù)據(jù)的驗(yàn)證,你可以定義實(shí)體,在實(shí)體的屬性上添加校驗(yàn)規(guī)則,而在API接收數(shù)據(jù)時(shí)添加@valid關(guān)鍵字,這時(shí)你的實(shí)體將會(huì)開啟一個(gè)校驗(yàn)的功能,具體的代碼如下,是最基本的應(yīng)用:
實(shí)體:
public class DepartmentDto {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("上級(jí)Id")
private String parentId;
@ApiModelProperty("編號(hào)")
@NotBlank(message = "部門編號(hào)不能為空。")
private String code;
@ApiModelProperty("名稱")
@NotBlank(message = "部門名稱不能為空。")
private String name;
@ApiModelProperty("員工集合")
@Builder.Default
private List<Employee> employees = new ArrayList<>();
}
Restful接口:
@PostMapping()
public Response<ClientAccount> initialAccount(
@ApiParam("客戶編號(hào)") @PathVariable String code,
@ApiParam("賬期") @PathVariable YearMonth accountPeriod,
@ApiParam("請(qǐng)求體") @Valid @RequestBody Request<DepartmentDto> request) {
ClientAccount result = clientAccountService.initialAccount(
code,
accountPeriod,
request.getOperator(),
request.getBody());{}
上面代碼中,我們?yōu)檎?qǐng)求體Request<DepartmentDto>添加了校驗(yàn),在測(cè)試時(shí),如果你的DepartmnetDto.name為空字符時(shí),當(dāng)出現(xiàn)400的異常,麗時(shí)異常消息是『部門名稱不能為空』,這對(duì)于我們來說是沒有問題的,也是符合我們要求的,下面看另一個(gè)場(chǎng)景。
需要驗(yàn)證的實(shí)體是另一個(gè)實(shí)休的屬性
這種方式我們也需要會(huì)看到,一個(gè)大對(duì)象,如被封裝的其它小對(duì)象組成,比如部門下面有員工,這時(shí)如果需要驗(yàn)證員工的有效性,需要如何實(shí)現(xiàn)呢?如果我們不修改源代碼,執(zhí)行結(jié)果是否定的, 它并不會(huì)校驗(yàn)員工這個(gè)對(duì)象,而只針對(duì)第一層對(duì)象的屬性 。
我們將實(shí)體的員工屬性添加上@Valid即可實(shí)現(xiàn)對(duì)這個(gè)屬性的校驗(yàn)
public class DepartmentDto {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("上級(jí)Id")
private String parentId;
@ApiModelProperty("編號(hào)")
@NotBlank(message = "部門編號(hào)不能為空。")
private String code;
@ApiModelProperty("名稱")
@NotBlank(message = "部門名稱不能為空。")
private String name;
@Valid
@ApiModelProperty("員工集合")
@Builder.Default
private List<Employee> employees = new ArrayList<>();
}
下面看一下驗(yàn)證結(jié)果,我們的400錯(cuò)誤就可以在單元測(cè)試下面正常輸出了!
@Test
public void initialAccount_employee_name_empty() {
List<Employee> employees = new ArrayList<>();
employees.add(Employee.builder()
.name("")
.email("zzl@sina.com")
.idNumber("110111198203182012")
.build());
List<DepartmentDto> departments = new ArrayList<>();
departments.add(DepartmentDto.builder()
.name("部門")
.description("技術(shù)部")
.salaryType(SalaryType.ResearchAndDevelopmentCosts)
.employees(employees)
.build());
ClientAccountDto clientAccountDto = ClientAccountDto.builder()
.name("客戶")
.departments(departments)
.build();
Request<ClientAccountDto> request = buildRequest(clientAccountDto);
api.post()
.uri("/v1/12345/2018-03")
.body(BodyInserters.fromObject(request))
.exchange()
.expectStatus().isEqualTo(400)
.expectBody()
.jsonPath("$.errors[0].message").isEqualTo("姓名不能為空");
}
結(jié)果如下,測(cè)試通過
如果是測(cè)試它是IsOk的話,由于用戶名為空,所以會(huì)出現(xiàn)錯(cuò)誤提示
api.post()
.uri("/v1/12345/2018-03")
.body(BodyInserters.fromObject(request))
.exchange()
.expectStatus().isOk();
可以看一下結(jié)果的提示信息
總結(jié)
以上所述是小編給大家介紹的springboot @Valid注解對(duì)嵌套類型的校驗(yàn),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
springboot 設(shè)置局域網(wǎng)訪問的實(shí)現(xiàn)步驟
Spring Boot是一個(gè)開源Java-based框架,用于創(chuàng)建獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用,它旨在簡(jiǎn)化Spring應(yīng)用的初始搭建及開發(fā)過程,通過提供各種自動(dòng)配置的starter包,Spring Boot使得項(xiàng)目配置變得簡(jiǎn)單快速,感興趣的朋友一起看看吧2024-02-02
SpringBoot整合EasyExcel實(shí)現(xiàn)批量導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)批量導(dǎo)入導(dǎo)出功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03

