SpringBoot 參數校驗



 

一、添加依賴

<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)
 
//其他
@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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM