一、添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
二、實體類中添加校驗規則注解
package cn.bounter.validation.entity; import lombok.Data; import lombok.experimental.Accessors; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; @Data @Accessors(chain = true) public class Bounter { @NotBlank private String name; @Min(18) private Integer age; }
JSR-303常用注解如下:
//空檢查
@NotNull 對象不為null
@NotBlank 字符串不為null且不是”“
@NotEmpty 集合不為null且不為空
//長度檢查
@Size(min = 1, max = 10) 字符串長度或集合大小
@Length 字符串長度
//數值檢查
@Min(1)
@Max(10)
@Range(min = 1, max = 10)
@Range(min = 1, max = 10)
//其他
@Email
@AssertTrue
@AssertFalse
三、開啟校驗(開啟后請求時會自動觸發校驗,校驗失敗拋出異常)
package cn.bounter.validation.controller; import cn.bounter.validation.common.ResponseData; import cn.bounter.validation.entity.Bounter; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/bounter") public class BounterController { @PostMapping public ResponseData<?> post(@Validated Bounter bounter) { return ResponseData.ok(bounter); } @PostMapping("/json") public ResponseData<?> postJson(@Validated @RequestBody Bounter bounter) { return ResponseData.ok(bounter); } @GetMapping public ResponseData<?> get(@Validated Bounter bounter) { return ResponseData.ok(bounter); } }
四、統一處理校驗異常,並返回錯誤提示
package cn.bounter.validation.common; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.stream.Collectors; @RestControllerAdvice public class AppExceptionHandler { /** * 處理不帶任何注解的參數綁定校驗異常 * @param e * @return */ @ExceptionHandler(BindException.class) public ResponseData<?> handleBingException(BindException e) { String errorMsg = e.getBindingResult().getAllErrors() .stream() .map(objectError -> ((FieldError)objectError).getField() + ((FieldError)objectError).getDefaultMessage()) .collect(Collectors.joining(",")); //"errorMsg": "name不能為空,age最小不能小於18" return new ResponseData<>().fail(errorMsg); } /** * 處理 @RequestBody參數校驗異常 * @param e * @return */ @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseData<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { String errorMsg = e.getBindingResult().getAllErrors() .stream() .map(objectError -> ((FieldError)objectError).getField() + ((FieldError)objectError).getDefaultMessage()) .collect(Collectors.joining(",")); //"errorMsg": "name不能為空,age最小不能小於18" return new ResponseData<>().fail(errorMsg); } }
五、如需要手動觸發校驗,則可使用下面的方式
package cn.bounter.validation; import cn.bounter.validation.entity.Bounter; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.validation.ConstraintViolation; import javax.validation.Validator; import java.util.Set; @RunWith(SpringRunner.class) @SpringBootTest public class BounterValidationApplicationTests { //參數校驗器 @Autowired private Validator validator; /** * 測試手動觸發校驗 */ @Test public void testValidation() { Bounter bounter = new Bounter().setName("").setAge(17); Set<ConstraintViolation<Bounter>> violationSet = validator.validate(bounter); violationSet.forEach(violation -> { //name不能為空 //age最小不能小於18 System.out.println(violation.getPropertyPath() + violation.getMessage()); }); } }
這就是全部的步驟了,是不是覺得的挺簡單的哉!那就趕快自己動手試試吧!
Github傳送門:https://github.com/13babybear/bounter-validation