Java后端校验@Valid---使用hibernate-validator校验Bean

使用场景

在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦:

  • 验证代码繁琐,重复劳动
  • 方法内代码显得冗长
  • 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码

hibernate validator提供了一套比较完善、便捷的验证实现方式。

知识点

首先我们看一下进行校验时,使用的有哪些依赖包

	<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>2.0.1.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate.validator</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>7.0.4.Final</version>
		</dependency>

主要使用的是这两个包,但在测试中,发现因为此包hibernate-validator 的版本问题,会出现@Valid 校验无效,BindingResult未获得错误 的问题。

如果大家遇到这种问题,先审查代码@valid 和BindingResult是否加入了,然后就可以考虑是不是版本的问题了。
笔者用另一台电脑测试了2.3.3版本的,同样可以校验

另外 spring-boot-starter-validation 依赖包含上述两个包,
所以我们不需要单独引入,只要引入

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

就可以自动匹配相应的依赖包,请看下图:
在这里插入图片描述

首先引入依赖
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.4.RELEASE</version>
	</parent>
	
	<properties>
		<maven.compiler.source>8</maven.compiler.source>
		<maven.compiler.target>8</maven.compiler.target>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>

附加一句:有的博客说引入了spring-boot-starter-web就够了,内部自带引入了上述我们所需的两个包,但是我在2.3.4这个版本中发现并没有引入,所以我们还是引入下吧

然后我们编写代码

userBo 需要验证的对象
@Data
public class UserBo {
    @NotBlank(message = "用户不能为空")
    //@NotNull(message = "用户不能为空")
    @Length(min = 3,max = 9,message = "用户名最少3字符,最多9字符")
    private String userName;
    @NotBlank(message = "年龄不能为空")
    @Length(min = 18,message = "年龄最小18岁")
    private String age;
    private String gender;
    @Pattern(regexp = "^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\\d{8})$", message = "手机号格式不正确")
    private String phone;
    @Email
    private String email;
}

知识点:
在写Controller 之前呢,有两个知识点

  • @Valid 该注解表示参数需要校验
  • BindingResult 将校验结果返回
controller
@RestController
@RequestMapping("user")
public class UserController {
    @PostMapping("/add")
    public String addUser( @RequestBody @Valid UserBo userBo, BindingResult result) {
        System.out.println(userBo);
        System.out.println(result);
        if (result.hasErrors()) {
            Map<String, String> errors = getErrors(result);
            System.err.println(errors);
        }
        return  null;
    }
    private Map<String, String> getErrors(BindingResult result) {
        Map<String, String> map = new HashMap<>();
        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError error : errorList) {
            // 发生验证错误所对应的某一个属性
            String errorField = error.getField();
            // 验证错误的信息
            String errorMsg = error.getDefaultMessage();

            map.put(errorField, errorMsg);
        }
        return map;
    }
}

综上,比如遇到了
@valid 无法触发 BindingResult 问题 主要还是版本问题

参考以下文章,希望能给到大家帮助。
https://blog.csdn.net/Lao_gan_ma/article/details/119175862

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值