Validation框架

系列文章目录

SpringBoot框架



前言

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异常

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值