Springboot使用hibernate-validator实现参数校验

简介: Springboot使用hibernate-validator实现参数校验

该篇只介绍关于对一个实体类内字段属性做参数校验。


因为我个人觉得加入拦截器AOP那种校验和直接对controller添加@Validated的这些方式,其实很多老项目是无法融入的,涉及到架构变改了。


而对一个实体类内字段属性做参数校验这种方式,是可以不动项目架构去扩展参数校验的。


OK,我们开始编码。


对于springboot项目,hibernate-validator 的使用虽然有专属的jar包依赖:


<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.17.Final</version>
</dependency>


但是在springboot的web包里也包含了这个jar,所以一般是不需要额外导入依赖的:


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


创建一个TestParams.java,这个类是用于接口接收参数的:


import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
/**
 * @Author : JCccc
 * @CreateTime : 2019/10/15
 * @Description :
 **/
@Data
public class TestParams {
    @NotBlank(message = "用户名不能为空")
    private String userName;
    @NotBlank(message = "密码不能为空")
    private String password;
    @NotBlank(message = "真实姓名不能为空")
    private String realName;
    @Range(min = 0, max = 99, message = "年龄应该在0到99之间")
    private Integer age;
    @Pattern(regexp = "男|女", message = "必须是男或女")
    private String sex;
    @Pattern(regexp = "\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}", message = "号码不正确")
    private String telephone;
}


PS: 这个类我用到了lombok,可以省掉很多代码,set/get /toString等等,没使用过的可以去了解下。


lombok依赖:


        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
            <scope>provided</scope>
        </dependency>


然后是测试接口,


    @PostMapping(value = "/testValidatorPost")
    public String testValidatorPost(@Valid @RequestBody TestParams testParams) {
        return "参数校验通过:"+ testParams.toString();
    }


调用这个post接口,故意传入不符合规则的参数:


image.png返回情况是:


image.png


这种情形,是因为在进入接口里面的逻辑前,开始了对这个testParams类参数的校验 ,校验不通过,所以直接返回400了,并且返回来很多信息,包括我们自己写的message。


但是,显然这种返回信息场景是不太能让人接受的,所以我们对这个接口稍作修改:


    @PostMapping(value = "/testValidatorPost")
    public String testValidatorPost(@Valid @RequestBody TestParams testParams, BindingResult result) {
        if (result.hasErrors()) {
            StringBuffer errorMessage = new StringBuffer("参数校验有误:");
            for (ObjectError error : result.getAllErrors()) {
                errorMessage = errorMessage.append(error.getDefaultMessage()).append(";");
            }
            System.out.println(errorMessage);
            return String.valueOf(errorMessage);
        }
        return "参数校验通过:" + testParams.toString();
    }


加上了BindingResult,并对errors进行逻辑处理,报错的时候也就是校验不通过时,我们进行逻辑处理。


再次调用接口(这里只是示例,我们可以将捕抓出来的message自行处理即可):


image.png


同样,Get请求也一样,如果是使用类接收,还是很方便的,效果是一样的:


    @GetMapping(value = "/testValidatorGet")
    public String testValidatorGet(@Valid TestParams testParams, BindingResult result) {
        if (result.hasErrors()) {
            StringBuffer errorMessage = new StringBuffer("参数校验有误:");
            for (ObjectError error : result.getAllErrors()) {
                errorMessage = errorMessage.append(error.getDefaultMessage()).append(";");
            }
            System.out.println(
                    errorMessage
            );
            return String.valueOf(errorMessage);
        }
        return "参数校验通过:" + testParams.toString();
    }


OK,到此。

相关文章
|
1月前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
49 1
Spring MVC——获取参数和响应
|
1月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
2月前
|
缓存 前端开发 Java
springboot 的单体服务 字典参数转译
本文介绍了如何在Spring Boot项目中使用缓存来管理字典参数,并确保前后端数据一致性。首先,通过`@EnableCaching`启用缓存功能,接着创建一个自定义的字典缓存类`DicCache`。然后,通过配置类将`DicCache`添加到`cacheManager`中。此外,对字典服务进行改造,使用`@CachePut`和`@CacheEvict`注解保证数据一致性。最后,实现自定义注解`@DicSerializer`和序列化处理类`DictSerializerHandel`,用于在序列化过程中自动转换字典值。通过这种方式,可最小化代码改动并提高系统性能。
springboot 的单体服务 字典参数转译
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
110 2
|
2月前
|
JSON Java 数据格式
springboot 参数统一处理
springboot 参数统一处理
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
129 0
|
1月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
40 0
|
2月前
|
Java Spring
spring boot 启动项目参数的设定
spring boot 启动项目参数的设定
|
3月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式