SpringBoot 參數校驗


 

1、添加依賴java

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

2、實體類中添加校驗規則註解git

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經常使用註解以下:github

//空檢查
@NotNull          對象不爲null
@NotBlank         字符串不爲null且不是」「 
@NotEmpty         集合不爲null且不爲空
 
//長度檢查
@Size(min = 1, max = 10)     字符串長度或集合大小
@Length                      字符串長度   
 
//數值檢查
@Min(1)
@Max(10)
@Range(min = 1, max = 10)
 
//其餘
@Email
@AssertTrue
@AssertFalse 
 
 
3、開啓校驗(開啓後請求時會自動觸發校驗,校驗失敗拋出異常)
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);
    }

}

 

4、統一處理校驗異常,並返回錯誤提示web

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);
    }

}

 

5、如須要手動觸發校驗,則可以使用下面的方式spring

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());
        });
    }

}

 

這就是所有的步驟了,是否是以爲的挺簡單的哉!那就趕快本身動手試試吧!json

Github傳送門:https://github.com/13babybear/bounter-validationapi

相關文章
相關標籤/搜索