您的位置:首页 > 编程语言 > Java开发

在 Spring Boot 使用 hibernate-validator 进行参数校验

2020-01-13 10:32 579 查看

在 Spring Boot 使用 hibernate-validator 进行参数校验

使用 hibernate-validator 进行参数校验可以免去繁琐的参数校验代码,使代码看上去更简洁。

1.什么是 hibernate-validator

hibernate-validator 用于对应用层的参数校验。

举一个简单的例子,在用户注册时,用户难免会输入一些不合规范的参数。例如:邮箱地址不合规范,手机号码不合规范,用户名长度超出范围等等的操作。而开发人员则需要编写代码来应对这些情况,但是校验代码出现在业务代码中会使业务代码十分臃肿。而 hibernate-validator 就可以帮助开发人员解决这些问题。

2.为什么使用 hibernate-validator

在上面的例子已经可以解释这一个问题了。

  • 使用 hibernate-validator 进行参数校验可以免去繁琐的参数校验代码,使代码看上去更简洁。
  • 使用 hibernate-validator 将参数校验代码和业务代码,降低代码的耦合度。
  • 无需考虑校验代码的实现,更专注与业务代码的实现。

3.如何使用 hibernate-validator

接下来我们使用一个用户注册的例子来学习使用 hibernate-validator 。

3.1 导入 hibernate-validator 依赖

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

因为

spring-boot-starter-web
包里面有
hibernate-validator
包,所以仅仅需要导入
spring-boot-starter-web
即可。

3.2 编写 User 类

public class User {
private String id;

@Size(min = 3 , max = 12 , message = "用户名长度在3~12字符之间")
@NotBlank(message="用户名不能为空")
private String userName;

@Size(min = 8 , message = "密码长度不能小于8个字符")
@NotBlank(message="密码不能为空")
private String userPassword;

@Email
@NotBlank(message="邮箱不能为空")
private String userEmail;

@Pattern(regexp = "1[3|4|5|7|8][0-9]\\d{8}" , message = "不是一个合法的手机号码")
@NotBlank(message="手机号码不能为空")
private String userPhone;

//...省略get、set方法
}

hibernate-validator 注解介绍:

  • @Size(min , max , message)
    元素的大小必须在指定的范围内。
  • @NotBlank(message)
    :只能用于校验字符串。字符串不能为null,并且
    trim()
    以后length要大于0,即不能只有空格。
  • @Email
    :元素必须是电子邮箱地址。
  • @Pattern(regexp = 正则表达式)
    :元素必须符合指定的正则表达式。

除了

@NotBlank(message)
还有其他校验参数不能为空的注解:

  • @NotNull
    :任何对象的value不能为null。
  • @NotEmpty
    :集合对象的元素不为0,即集合不为空,也可以用于字符串不为null。

3.3 编写 UserController 类

@RestController
@RequestMapping("api/user")
public class UserController {

@RequestMapping(value = "/" , method = RequestMethod.POST)
public Object add(@RequestBody @Valid User user , BindingResult result){
// 如果参数有错误
if (result.hasErrors()){
List<String> errorList = new ArrayList<>();
for (ObjectError error : result.getAllErrors()) {
errorList.add(error.getDefaultMessage());
}
return errorList;	//返回错误信息
}
return "注册成功";	//模拟注册成功
}
}

hibernate-validator 注解介绍:

  • @Valid
    :用于嵌套校验,示例中表示开启校验 User 类的字段。

BindingResult
对象,用于获取
@Valid
校验失败情况下的反馈信息。(可选)

@Valid
注解和
BindingResult
对象应该成对出现,一个
@Valid
注解对应一个
BindingResult
对象

启动项目查看效果:


从运行结果可以发现,hibernate-validator 将所有的参数错误都校验出来并返回了。但是通常我们在注册用户时只会返回一个错误信息。从这里我们就引出了 hibernate-validator 的两种模式,普通模式和快速失败返回模式。

3.4 配置 hibernate-validator

@Configuration
public class ValidatorConfiguration {
/**
* 配置hibernate Validator为快速失败返回模式
*/
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

return validator;
}
}

@Configuration
注解用于使spring加载配置类。

创建一个

Validator
(验证器)Bean,使用
addProperty
函数将验证器设置为快速失败返回模式。

启动项目查看效果:

3.5 校验 @RequestParam 参数

使用校验bean的方式,没有办法校验RequestParam的内容。我们需要其他注解来实现对

@RequestParam
参数的校验。

ValidatorConfiguration
配置 hibernate-validator。

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
/**设置validator模式为快速失败返回*/
postProcessor.setValidator(validator());
return postProcessor;
}

假设我们实现一个通过用户名查询用户的接口。

@RestController
@RequestMapping("api/user")
@Validated
public class UserController {

@RequestMapping(value = "/" , method = RequestMethod.GET)
public Object query(
@NotBlank
@Size(min = 3 , max = 12 , message = "用户名长度在3~12字符之间")
@RequestParam String userName){
//...具体接口实现
}
}

hibernate-validator 注解介绍:

  • @Validated
    :开启校验 @RequestParam 参数

启动项目查看效果:

还有很多其他的 hibernate-validator 注解,可以自己尝试和学习。

4.关注我的微信公众号,查看更多文章,第一时间收到我的文章。

在 Spring Boot 使用 hibernate-validator 进行参数校验,你学会了吗?

参考文档:springboot使用hibernate validator校验

  • 点赞
  • 收藏
  • 分享
  • 文章举报
lixiaofeng101 发布了14 篇原创文章 · 获赞 1 · 访问量 677 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: