SpringBoot系列——validation參數校驗


  前言

  日常開發中,接口的參數校驗必不可少,本文記錄使用validation優雅進行參數校驗。

  官方介紹:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-validation

 

  代碼編寫

  引入依賴

        <!--引入validation依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

  創建兩種Vo

/**
 * 用戶Vo
 */
@Data
public class UserVoByAdd {

    @Pattern(regexp = "\\d+$",message = "主鍵只能是數字")
    @NotEmpty(message = "主鍵不能為空")
    private String id;//表id

    @NotEmpty(message = "名字不能為空")
    private String name;//名字

    @DecimalMin(value = "18",message = "年齡不能小於18歲")
    @DecimalMax(value = "25",message = "年齡不能大於25歲")
    @NotNull(message = "年齡不能為空")
    private Integer age;//年齡

    @NotEmpty(message = "地址不能為空")
    private String addr;//地址

    @Email(message = "郵件格式不正確")
    @NotEmpty(message = "郵件不能為空")
    private String email;//郵件
}
/**
 * 用戶Vo
 */
@Data
public class UserVoByEdit {

    @NotEmpty(message = "主鍵不能為空")
    private String id;//表id

    private String name;//名字

    @DecimalMin(value = "18",message = "年齡不能小於18歲")
    @DecimalMax(value = "25",message = "年齡不能大於25歲")
    private Integer age;//年齡

    private String addr;//地址

    @Email(message = "郵件格式不正確")
    private String email;//郵件
}

  統一異常捕獲

/**
 * 統一異常處理
 */
@RestControllerAdvice
public class ExceptionHandlerConfig {

    /**
     * validation參數校驗異常 統一處理
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public Result exceptionHandler500(BindException e){
        e.printStackTrace();
        StringBuilder stringBuilder = new StringBuilder();
        for (ObjectError error : e.getAllErrors()) {
            stringBuilder.append("[");
            stringBuilder.append(((FieldError) error).getField());
            stringBuilder.append(" ");
            stringBuilder.append(error.getDefaultMessage());
            stringBuilder.append("]");
        }
        return Result.of(10002,false,"【參數校驗失敗】 " + stringBuilder.toString());
    }
    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseBody
    public Result exceptionHandler500(ConstraintViolationException e){
        e.printStackTrace();
        StringBuilder stringBuilder = new StringBuilder();
        for (ConstraintViolation<?> error : e.getConstraintViolations()) {
            PathImpl pathImpl = (PathImpl) error.getPropertyPath();
            String paramName = pathImpl.getLeafNode().getName();
            stringBuilder.append("[");
            stringBuilder.append(paramName);
            stringBuilder.append(" ");
            stringBuilder.append(error.getMessage());
            stringBuilder.append("]");
        }
        return Result.of(10002,false,"【參數校驗失敗】 " + stringBuilder.toString());

    }

    /**
     * 未知異常 統一處理
     */
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public Result exceptionHandler(Exception e){
        e.printStackTrace();
        return Result.of(10001,false,"【未知異常】 "+e.getMessage());
    }
}

  測試controller

/**
 * 測試Controller
 */
@Validated
@RestController
@RequestMapping("/test/")
public class Controller {

    /**
     * 新增用戶
     */
    @RequestMapping("addUser")
    public Result addUser(@Validated UserVoByAdd userVo){
        System.out.println(userVo);
        return Result.of( "操作成功!");
    }

    /**
     * 編輯用戶
     */
    @RequestMapping("editUser")
    public Result editUser(@Validated UserVoByEdit userVo){
        System.out.println(userVo);
        return Result.of( "操作成功!");
    }

    /**
     * 根據id查找用戶
     */
    @RequestMapping("findUserById")
    public Result findUserById(@Size(min = 1, max = 5,message = "id超出范圍") @NotEmpty(message = "id不能為空") String id) {
        System.out.println(id);
        return Result.of( "操作成功!");
    }
}

  效果演示

  addUser

  http://localhost:10010/test/addUser

  http://localhost:10010/test/addUser?id=123&name=張三&email=1111@qq.com&age=20&addr=南寧市

 

 

 

  editUser

  http://localhost:10010/test/editUser

  http://localhost:10010/test/editUser?id=123&name=李四&age=20

 

 

 

 

 

 

 

 

 

  findUserById

  http://localhost:10010/test/findUserById

  http://localhost:10010/test/findUserById?id=123

 

 

 

 

 

 

 

 

   后記

  springboot-validation參數校驗暫時先記錄到這,后續再進行補充。

 

  代碼開源

 

  代碼已經開源、托管到我的GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springBoot

  碼雲:https://gitee.com/huanzi-qch/springBoot


免責聲明!

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



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