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接口,故意传入不符合规则的参数:

返回情况是:

 

这种情形,是因为在进入接口里面的逻辑前,开始了对这个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自行处理即可):

同样,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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Spring Boot 中,可以使用 Hibernate Validator 来进行请求参数校验。具体步骤如下: 1. 引入 Hibernate Validator 依赖: ```xml <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency> ``` 2. 在需要校验的请求参数实体类中添加校验注解,例如: ```java public class User { @NotBlank(message = "用户名不能为空") private String username; @NotBlank(message = "密码不能为空") private String password; @Email(message = "邮箱格式不正确") private String email; // 省略 getter 和 setter 方法 } ``` 3. 在请求处理方法中添加 @Validated 注解,并在参数上添加 @Valid 注解,例如: ```java @RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/login") public Result login(@RequestBody @Valid User user) { // 处理登录逻辑 } } ``` 4. 当请求参数不符合校验规则时,会抛出 ConstraintViolationException 异常。可以在全局异常处理器中对该异常进行处理,例如: ```java @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) public Result handleConstraintViolationException(ConstraintViolationException e) { List<String> errorMessages = e.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); return Result.error(String.join(",", errorMessages)); } } ``` 这样就可以自定义请求参数校验了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值