系列文章目录
前言
Spring Boot Validation是Spring Boot整合了Hibernate Validation的一个框架, 其核心是Hibernate Validation,
此框架的作用: 检验客户端向服务器端提交的请求参数的基本格式是否合法
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建项目
创建Spring Boot工程, 名称为Validation, 在创建过程中勾选web > Spring web和IO > Validation这两个依赖项
二、常用注解
- @NotNull : 不允许为null值, 如果客户端提交的参数中根本没有这一项, 则视为null
- @NotBlank : 不允许为空白值, 空白值包括由若干个空格、TAB符等组成的字符
- @NotEmpty : 不允许为空字符串, 即不允许是长度为0的字符串
- @pattern : 可用正则验证
还有像max, min ,size等注解…
三、测试运行
1.创建验证接口类
如果使用Validation验证请求参数的基本格式是否和法, 需要将参数封装进自定义类中, 因为验证规则被频繁使用, 而且不改变, 在使用中一般声明为接口, 使需要验证的实体类实现接口
在根包下创建
valid
包, 并新建接口类: RegExpression 和 UserLoginRegExpression
package cn.qiangtian.validation.pojo.valid;
/**
* <p>正则表达式的根级接口, 定义了通用的正则表达式和提示文本</p>
*
* <p>使用接口主要是为了便于定义常量, 并利于相关类实现, 以简化在类中使用常量的语法</p>
*/
public interface RegExpression {
}
package cn.tedu.csmall.pojo.valid;
/**
* <p>属性数据的表达式接口,定义了相关的正则表达式和提示文本</p>
*
* <p>使用接口主要是为了便于定义常量,并利于相关类实现,以简化在类中使用常量的语法</p>
*/
public interface AttributeRegExpression extends RegExpression {
String REGEXP_NAME = ".{2,6}";
String MESSAGE_NAME = "名称必须由2~16字符组成!";
String REGEXP_VALUE_LIST = ".{0,255}";
String MESSAGE_VALUE_LIST = "备选值列表的长度不得超过255字符!";
String REGEXP_UNIT = ".{0,6}";
String MESSAGE_UNIT = "计量单位的长度不得超过6字符!";
}
2.创建DTO类
在根包下创建
dto
包, 并新建 UserLoginDTO 类:
package cn.qiangtian.validation.pojo.dto;
import cn.qiangtian.validation.pojo.valid.UserLoginRegExpression;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
public class UserLoginDTO implements UserLoginRegExpression {
@NotNull(message = MESSAGE_NULL_USERNAME)
@Pattern(regexp = REGEXP_USERNAME,message = MESSAGE_USERNAME)
private String username;
@NotNull(message = MESSAGE_NULL_PASSWORD)
@Pattern(regexp = REGEXP_PASSWORD,message = MESSAGE_PASSWORD)
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserLoginDTO{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
3.创建控制器类
在根包下创建
controller
包, 并新建UserCotroller类:
package cn.qiangtian.validation.controller;
import cn.qiangtian.validation.pojo.dto.UserLoginDTO;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class UserController {
// http://localhost:8080/login?username=root&password=12345678
@RequestMapping("/login")
public String login(@Valid UserLoginDTO userLoginDTO){
System.out.println("userLoginDTO = " + userLoginDTO);
return "登录成功";
}
}
4.运行效果
项目结构
启动项目, 客户端访问
http://localhost:8080/login?username=root&password=12345678
如果用户名不和规范, 访问时会抛出BindException绑定异常:
http://localhost:8080/login?username=1&password=12345678
如果用户名与密码同时验证不通过, 访问时会抛出1个BindException异常和2个错误的信息 :
http://localhost:8080/login?username=1&password=1
5.获取验证结果
在控制器中, 当需要获取验证失败时的提示文本时, 需要在被验证的参数右侧添加
BindingResult
参数(必须添加在被验证对象的右侧, 中间不可以添加其他参数)
package cn.qiangtian.validation.controller;
import cn.qiangtian.validation.pojo.dto.UserLoginDTO;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class UserController {
// http://localhost:8080/login?username=root&password=12345678
@RequestMapping("/login")
public String login(@Valid UserLoginDTO userLoginDTO, BindingResult bindingResult){
// 判断验证是否不通过
boolean hasErrors = bindingResult.hasErrors();
System.out.println("验证是否不通过: " + hasErrors);
if (bindingResult.getFieldError() != null){
// 获取验证失败的提示文本, 如有多个条件没有被满足, 则不确定是哪个提示文本
String defaultMessage = bindingResult.getFieldError().getDefaultMessage();
System.out.println("错误提示: " + defaultMessage);
}
return "登录成功";
}
}
此时提交验证不通过的请求, 获取到错误的提示, 由于多个验证不通过, 也不确定, 但是只要方法上声明了验证结果的参数, 页面就会处理到
登录成功
, 不会抛出BindException异常