zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    监视用户是保存用户编辑还是放弃参照编辑
    AutoCAD: 添加鼠标快捷键/鼠标右键
    C# List<T>集合布尔运算
    List<T>的用法详解
    天正的坑
    C#札记
    AUTOCAD2013 以上利用ACCORECONSOLE+ SCR后台批量清理图纸
    BaiduSitemap
    三一邮件群发
    Windows+IIS+Mysql+php安装
  • 原文地址:https://www.cnblogs.com/gdufs/p/10964771.html
Copyright © 2011-2022 走看看