SpringBoot业务开发 05、SpringBoot优雅入参参数校验

简介: SpringBoot业务开发 05、SpringBoot优雅入参参数校验

优雅入参校验


引入依赖


这是hibernate中的校验器,也可以用来作为传参时的校验:


<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<!--  若是不引入下面依赖,校验就会无效,因为上面仅仅只是接口并不是实现   -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.2.Final</version>
</dependency>


相关的注解有如下这些:



代码

说明

@Null

被注解的元素必须为null

@NotNull

被注解的元素必须不为null

@AssertTrue

被注解的元素必须为true

@AssertFalse

被注解的元素必须为false

@Min(value)

被注解的元素必须为数字,其值必须大于等于最小值

@Max(value)

被注解的元素必须为数字,其值必须小于等于最小值

@Size(max,min)

被注解的元素的大小必须在指定范围内

@Past

被注解的元素必须为过去的一个时间

@Future

被注解的元素必须为未来的一个时间


1、编写请求实体类(使用如@NotNull等标注)

我们来比较常用的进行注解测试即可:


/**
 * @ClassName Test
 * @Author ChangLu
 * @Date 2021/8/15 21:37
 * @Description TODO
 */
@Data
public class Test {
    //其中message即为校验不通过时对应的描述信息
    @NotNull(message = "id不能为null")
    private Integer id;
    @Size(min = 2, max = 5)
    @NotNull(message = "name不能为null")
    private String name;
    @Max(value = 10000, message = "库存不能大于10000")
    private Integer type;
}



2、全局捕捉+应用

实际应用:在controller的指定参数中添加@Valid


@RestController
public class TestController {
    //当对指定请求体实体类前标注@Valid,就会对该实体类的所有参数进行校验
    @GetMapping("/test")
    public ResultBody test(@Valid @RequestBody Test test){
        return ResultBody.success(test);
    }
}


那么我们如何拿到对应校验的结果呢?一般有两种方式


直接在后面跟着BindingResult bindingResult,接着即可拿到指定的校验结果,此时会进行下去。

通过全局异常捕捉,从异常类中获取到校验结果!(推荐)

我们来采用第二种方式来拿到校验结果并且进行同一返回响应!


/**
 * @author Administrator
 * @date 2021/07/22 17:27
 **/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 请求参数校验异常捕捉
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResultBody MethodArgumentNotValidHandler(MethodArgumentNotValidException e){
        log.error("MethodArgumentNotValidException:",e);
        return handleBindingResult(e);
    }
    public ResultBody handleBindingResult(BindingResult result){
        ArrayList<String> list = new ArrayList<>();
        if(result.hasErrors()){
            //拿到所有的校验问题实体类
            List<ObjectError> errors = result.getAllErrors();
            for (ObjectError error : errors) {
                list.add(error.getDefaultMessage());
            }
        }
        if(list.size() == 0){
            return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR);  // REQUEST_PARAM_ERROR(2002,"请求参数有误"),
        }
        return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR.getResultCode(),list.toString());
    }
}


说明:会对指定实体类中的所有参数都进行一一校验,并且我们可以通过异常拿到所有的校验结果!



测试
@RestController
public class TestController {
    @GetMapping("/test")
    public ResultBody test(@Valid @RequestBody Test test){
        return ResultBody.success(test);
    }
}



我们可以看到返回得到了两条校验信息,说明所有的参数都是进行校验过的!


相关文章
|
1月前
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
64 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
1月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
150 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
26天前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
44 1
Spring MVC——获取参数和响应
|
2天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
9 0
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
130 2
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
|
2月前
|
缓存 前端开发 Java
springboot 的单体服务 字典参数转译
本文介绍了如何在Spring Boot项目中使用缓存来管理字典参数,并确保前后端数据一致性。首先,通过`@EnableCaching`启用缓存功能,接着创建一个自定义的字典缓存类`DicCache`。然后,通过配置类将`DicCache`添加到`cacheManager`中。此外,对字典服务进行改造,使用`@CachePut`和`@CacheEvict`注解保证数据一致性。最后,实现自定义注解`@DicSerializer`和序列化处理类`DictSerializerHandel`,用于在序列化过程中自动转换字典值。通过这种方式,可最小化代码改动并提高系统性能。
springboot 的单体服务 字典参数转译
|
30天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
24 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
13天前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
12 0
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
100 2
下一篇
无影云桌面