SpringCloud微服務實戰——搭建企業級開發框架(八):使用註解校驗微服務訊息引數
阿新 • • 發佈:2021-10-28
平時開發過程中,經常要用到引數校驗,如果直接在程式碼邏輯裡面寫引數校驗,程式碼有點冗餘且用起來不是非常方便,顯得程式碼邏輯複雜且重複程式碼太多,這裡我們使用註解的方式進行引數校驗,SpringBoot中常用的用於引數校驗的註解如下:
@AssertFalse 所註解的元素必須是Boolean型別,且值為false @AssertTrue 所註解的元素必須是Boolean型別,且值為true @DecimalMax 所註解的元素必須是數字,且值小於等於給定的值 @DecimalMin 所註解的元素必須是數字,且值大於等於給定的值 @Digits 所註解的元素必須是數字,且值必須是指定的位數 @Future 所註解的元素必須是將來某個日期 @Max 所註解的元素必須是數字,且值小於等於給定的值 @Min 所註解的元素必須是數字,且值小於等於給定的值 @Range 所註解的元素需在指定範圍區間內 @NotNull 所註解的元素值不能為null @NotBlank 所註解的元素值有內容 @Null 所註解的元素值為null @Past 所註解的元素必須是某個過去的日期 @PastOrPresent 所註解的元素必須是過去某個或現在日期 @Pattern 所註解的元素必須滿足給定的正則表示式 @Size 所註解的元素必須是String、集合或陣列,且長度大小需保證在給定範圍之內 @Email 所註解的元素需滿足Email格式
1、在GitEgg-Platform工程的子工程gitegg-platform-boot裡新增spring-boot-starter-validation依賴,因為自SpringBoot2.3.X開始spring-boot-starter-web預設不再引入校驗框架,這裡需要手動引入,pom.xml如下
<!--?xml version="1.0" encoding="UTF-8"?--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactid>GitEgg-Platform</artifactid> <groupid>com.gitegg.platform</groupid> <version>1.0-SNAPSHOT</version> </parent> <modelversion>4.0.0</modelversion> <artifactid>gitegg-platform-boot</artifactid> <name>${project.artifactId}</name> <version>${project.parent.version}</version> <packaging>jar</packaging> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-validation</artifactid> </dependency> <dependency> <groupid>com.gitegg.platform</groupid> <artifactid>gitegg-platform-swagger</artifactid> <optional>true</optional> </dependency> </dependencies> </project>
2、GitEgg-Platform工程重新install,在GitEgg-Cloud工程的子工程gitegg-service-system裡面新建類SystemDTO.java
package com.gitegg.service.system.dto; import lombok.Data; import javax.validation.constraints.*; @Data public class SystemDTO { @NotNull @Min(value = 10, message = "id必須大於10") @Max(value = 150, message = "id必須小於150") private Long id; @NotNull(message = "名稱不能為空") @Size(min = 3, max = 20, message = "名稱長度必須在3-20之間") private String name; }
3、SystemController.java類裡面新增引數校驗測試介面
package com.gitegg.service.system.controller;
import com.gitegg.platform.boot.common.base.Result;
import com.gitegg.platform.boot.common.exception.BusinessException;
import com.gitegg.service.system.dto.SystemDTO;
import com.gitegg.service.system.service.ISystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping(value = "system")
@AllArgsConstructor
@Api(tags = "gitegg-system")
public class SystemController {
private final ISystemService systemService;
@GetMapping(value = "list")
@ApiOperation(value = "system list介面")
public Object list() {
return systemService.list();
}
@GetMapping(value = "page")
@ApiOperation(value = "system page介面")
public Object page() {
return systemService.page();
}
@GetMapping(value = "exception")
@ApiOperation(value = "自定義異常及返回測試介面")
public Result<string> exception() {
return Result.data(systemService.exception());
}
@PostMapping(value = "valid")
@ApiOperation(value = "引數校驗測試介面")
public Result<systemdto> valid(@Valid @RequestBody SystemDTO systemDTO) {
return Result.data(systemDTO);
}
}
4、執行GitEggSystemApplication.java,開啟瀏覽器訪問:http://127.0.0.1:8001/doc.html,然後點選左側的引數校驗測試介面,使用Swagger2進行測試,即可檢視校驗結果
5、這裡的提示資訊用到了上一章節講到的統一異常處理邏輯:
/**
* 非法請求-引數校驗
*/
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException methodArgumentNotValidException) {
//獲取異常欄位及對應的異常資訊
StringBuffer stringBuffer = new StringBuffer();
methodArgumentNotValidException.getBindingResult().getFieldErrors().stream()
.map(t -> t.getField() + t.getDefaultMessage() + ";")
.forEach(e -> stringBuffer.append(e));
String errorMessage = stringBuffer.toString();
Result result = Result.error(ResultCodeEnum.PARAM_VALID_ERROR, errorSystem + errorMessage);
return result;
}
本文原始碼在https://gitee.com/wmz1930/GitEgg的chapter-08分支。