spring boot輸入數據校驗(validation)的實現過程
項目內容
實現一個簡單的用戶註冊接口,演示怎樣進行數據校驗。
要求
- JDK1.8或更新版本
- Eclipse開發環境
如沒有開發環境,可參考 [spring boot 開發環境搭建(Eclipse)]。
項目創建
創建spring boot項目
打開Eclipse,創建spring boot的spring starter project項目,選擇菜單:File > New > Project ...
,彈出對話框,選擇:Spring Boot > Spring Starter Project
,在配置依賴時,勾選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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.qikegu</groupId> <artifactId>springboot-validation-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-validation-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
代碼實現
項目目錄結構如下圖,添加瞭幾個類,下面將詳細介紹。
創建RegisterRequest
類
用戶註冊時,要求輸入手機號、密碼、昵稱,創建RegisterRequest類來接受前端傳過來的數據,同時校驗數據,校驗都是通過註解的方式實現。
public class RegisterRequest { @SuppressWarnings("unused") private static final org.slf4j.Logger log = LoggerFactory.getLogger(RegisterRequest.class); @NotNull(message="手機號必須填") @Pattern(regexp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$", message="賬號請輸入11位手機號") // 手機號 private String mobile; @NotNull(message="昵稱必須填") @Size(min=1, max=20, message="昵稱1~20個字") private String nickname; @NotNull(message="密碼必須填") @Size(min=6, max=16, message="密碼6~16位") private String password; public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
說明
RegisterRequest
類有3個成員變量:mobile
,nickname
, password
,這些變量都帶有註解:
- @NotNull 表示必填
- @Size 字符串長度必須符合指定范圍
- @Pattern 輸入字符串必須匹配正則表達式
創建控制器
我們創建AuthController
控制器類,實現一個用戶註冊的接口:
package com.qikegu.demo.controller; import javax.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.qikegu.demo.common.util.MiscUtil; import com.qikegu.demo.common.util.Result; import com.qikegu.demo.model.RegisterRequest; @RestController @RequestMapping("/auth") public class AuthController { @RequestMapping(value = "/register", method = RequestMethod.POST, produces="application/json") public ResponseEntity<Result> register( @Valid @RequestBody RegisterRequest register, BindingResult bindingResult ) { if(bindingResult.hasErrors()) { //rfc4918 - 11.2. 422: Unprocessable Entity // res.setStatus(422); // res.setMessage("輸入錯誤"); // res.putData("fieldErrors", bindingResult.getFieldErrors()); Result res1 = MiscUtil.getValidateError(bindingResult); return new ResponseEntity<Result>(res1, HttpStatus.UNPROCESSABLE_ENTITY); } Result res = new Result(200, "ok"); return ResponseEntity.ok(res); } }
說明
方法register有2個參數
@Valid @RequestBody RegisterRequest register
@RequestBody 表明輸入來自請求body,@Valid表明在綁定輸入時作校驗BindingResult bindingResult
這個參數存放校驗結果
輔助類 MiscUtil,Result
直接返回bindingResult過於復雜,使用MiscUtil.getValidateError簡化校驗結果
static public Result getValidateError(BindingResult bindingResult) { if(bindingResult.hasErrors() == false) return null; Map<String,String> fieldErrors = new HashMap<String, String>(); for(FieldError error : bindingResult.getFieldErrors()){ fieldErrors.put(error.getField(), error.getCode() + "|" + error.getDefaultMessage()); } Result ret = new Result(422, "輸入錯誤"); //rfc4918 - 11.2. 422: Unprocessable Entity ret.putData("fieldErrors", fieldErrors); return ret; }
Result是結果封裝類,[spring boot 接口返回值封裝] 那一篇中已經介紹過。
運行
Eclipse左側,在項目根目錄上點擊鼠標右鍵彈出菜單,選擇:run as -> spring boot app
運行程序。 打開Postman訪問接口,運行結果如下:
輸入錯誤的情況
輸入正確的情況
總結
完整代碼
到此這篇關於spring boot輸入數據校驗(validation)的文章就介紹到這瞭,更多相關spring boot數據校驗內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot數據校驗功能的實現
- Spring4下validation數據校驗無效(maven)的解決
- @Valid 校驗無效,BindingResult未獲得錯誤的解決
- springboot表單提交之validator校驗
- Spring 使用Validation 驗證框架的問題詳解