Springboot(四十四)Springboot集成Validation实现参数校验

115 阅读4分钟

在开发过程中,前端调用接口之前会判断必要的参数是否有值。但是这个情况只有前端判断是不可以的。还要在后端接口中作判断。

 

我之前就是直接在接口中写if判断,判断必要的参数是否为空或者null,再执行后边的逻辑。

 

最近在查找资料的时候,发现Springboot有一个参数校验框架Validation,这个玩意很好用。有了他我就不需要在接口中写if判断了~

 

一:引入pom依赖

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

 

二:在controller中使用

1:在类上添加注解@Validated

 

2:在方法中进行校验

(1):原来我是这么写的:

/**
 * 文章详情
 * @param article_id
 * @param request
 * @return
 * @throws Exception
 */
@GetMapping("article/getArticleDetail")
@MySentinelResource(resource = "getData", number = 1// 自定义注解:sentinel限流
public Map<String, Object> getArticleDetail(@RequestParam(defaultValue = "") String article_id, HttpServletRequest request) throws Exception
{
    // 参数判断
    if(article_id == "" || article_id == null)
    {
        Map<StringObjectresult = new HashMap<>(2);
        result.put("code",-1);
        result.put("msg","参数错误!");
        return result;
    }
    Map<StringObjectresult = articleService.getArticleDetail(article_id,request);
    return result;
}

 

(2):使用Validation框架之后:

/**
     * 文章详情
     * @param article_id
     * @param request
     * @return
     * @throws Exception
     */
    @GetMapping("article/getArticleDetail")
    @MySentinelResource(resource = "getData", number = 1// 自定义注解:sentinel限流
    public Map<String, Object> getArticleDetail(@NotEmpty(message = "id不能为空"@RequestParam(defaultValue = "") String article_id, HttpServletRequest request) throws Exception
    {
        Map<StringObjectresult = articleService.getArticleDetail(article_id,request);
        return result;
    }

 

3:自定义全局统一异常

package com.modules.exception;
 
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
 
import java.util.HashMap;
import java.util.Map;
 
@RestControllerAdvice
@Slf4j
@Order(1// 控制加载顺序,值越小,越先加载
public class ValidationException
{
    /**
     * 参数异常
     * @desc 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public Map<StringObjectconstraintViolationException(HttpServletRequest request, ConstraintViolationException e)
    {
        // 处理异常的逻辑
        // 例如,记录日志、通知管理员、返回自定义的错误信息等
        log.info("参数异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<StringObject> map = new HashMap<>();
        map.put("code", -771);
        map.put("msg", e.getMessage());
        return map;
    }
 
    /**
     * 参数异常
     * @desc 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(BindException.class)
    public Map<StringObjectBindExceptionHandler(HttpServletRequest request,BindException e)
    {
        // 处理异常的逻辑
        // 例如,记录日志、通知管理员、返回自定义的错误信息等
        log.info("参数异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<StringObject> map = new HashMap<>();
        map.put("code", -772);
        map.put("msg", e.getMessage());
        return map;
    }


    /**
     * 参数异常
     * @desc 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<StringObjectMethodArgumentNotValidExceptionHandler(HttpServletRequest request,MethodArgumentNotValidException e)
    {
        // 处理异常的逻辑
        // 例如,记录日志、通知管理员、返回自定义的错误信息等
        log.info("参数异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<StringObject> map = new HashMap<>();
        map.put("code", -773);
        map.put("msg", e.getMessage());
        return map;
    }
}

 

上边的代码完成之后,重启项目,浏览器访问:

http://localhost:10010/java/article/getArticleDetail

 

浏览器输出:

{"msg":"getArticleDetail.article_id: id不能为空","code":-771}

 

到这里简单的使用就已经配置完成了。

 

补:也可以在实体类上添加注解:

@Data
public class Student{
    @NotNull(message = "id不能为空")
    private Integer id;
 
    @NotBlank(message = "name不能为空")
    @Length(max = 5,min = 2,message = "名称长度二位-5位")
    private String name;
 
    @Max(value = 50,message = "年龄不能大于50")
    @Min(value = 10,message = "年龄不能小于10")
    @NotNull(message = "年龄不能为空")
    private Integer age;
}

 

三:Validation详细方法

空检查

注解描述
@Null验证对象是否为null
@NotNull验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格
@NotEmpty检查约束元素是否为NULL或者是EMPTY

Booelan检查

注解描述
@AssertTrue验证 Boolean 对象是否为 true
@AssertFalse验证 Boolean 对象是否为 false

长度检查

注解描述
@Size(min=,   max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=,   max=)验证字符串的长度是否在给定的范围之内,包含两端

日期检查

注解描述
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后

数值检查

建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null

注解描述
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@DecimalMax被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=)验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=,   max=)检查带注释的值是否位于(包括)指定的最小值和最大值之间。
@Email验证是否是邮件地址,如果为null,不进行验证,算通过验证

 

以上大概就是Validation的基本使用。

 

有好的建议,请在下方输入你的评论。