spring boot输入数据校验(validation)的实现过程

项目内容

实现一个简单的用户注册接口,演示怎样进行数据校验。

要求

  • JDK1.8或更新版本
  • Eclipse开发环境

如没有开发环境,可参考 [spring boot 开发环境搭建(Eclipse)]。

项目创建

创建spring boot项目

打开Eclipse,创建spring boot的spring starter project项目,选择菜单:File > New > Project ...,弹出对话框,选择:Spring Boot > Spring Starter Project,在配置依赖时,勾选web,完成项目创建。

项目依赖

pom.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.qikegu</groupId>
	<artifactId>springboot-validation-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-validation-demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

代码实现

项目目录结构如下图,添加了几个类,下面将详细介绍。

创建RegisterRequest

用户注册时,要求输入手机号、密码、昵称,创建RegisterRequest类来接受前端传过来的数据,同时校验数据,校验都是通过注解的方式实现。

public class RegisterRequest {

	@SuppressWarnings("unused")
	private static final org.slf4j.Logger log = LoggerFactory.getLogger(RegisterRequest.class);

	@NotNull(message="手机号必须填")
	@Pattern(regexp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$", message="账号请输入11位手机号") // 手机号
	private String mobile;

	@NotNull(message="昵称必须填")
	@Size(min=1, max=20, message="昵称1~20个字")
	private String nickname;

    @NotNull(message="密码必须填")
    @Size(min=6, max=16, message="密码6~16位")
	private String password;

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

说明

RegisterRequest类有3个成员变量:mobilenicknamepassword,这些变量都带有注解:

  • @NotNull 表示必填
  • @Size 字符串长度必须符合指定范围
  • @Pattern 输入字符串必须匹配正则表达式

创建控制器

我们创建AuthController控制器类,实现一个用户注册的接口:

package com.qikegu.demo.controller;

import javax.validation.Valid;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.qikegu.demo.common.util.MiscUtil;
import com.qikegu.demo.common.util.Result;
import com.qikegu.demo.model.RegisterRequest;

@RestController
@RequestMapping("/auth")
public class AuthController {

    @RequestMapping(value = "/register", method = RequestMethod.POST, produces="application/json")
    public ResponseEntity<Result> register(
    	@Valid @RequestBody RegisterRequest register,
    	BindingResult bindingResult
    ) {
		if(bindingResult.hasErrors()) {
			//rfc4918 - 11.2. 422: Unprocessable Entity
//			res.setStatus(422);
//			res.setMessage("输入错误");
//			res.putData("fieldErrors", bindingResult.getFieldErrors());

			Result res1 = MiscUtil.getValidateError(bindingResult);

			return new ResponseEntity<Result>(res1, HttpStatus.UNPROCESSABLE_ENTITY);
		}

		Result res = new Result(200, "ok");
        return ResponseEntity.ok(res);
    }
}

说明

方法register有2个参数

  • @Valid @RequestBody RegisterRequest register@RequestBody 表明输入来自请求body,@Valid表明在绑定输入时作校验
  • BindingResult bindingResult 这个参数存放校验结果

辅助类 MiscUtil,Result

直接返回bindingResult过于复杂,使用MiscUtil.getValidateError简化校验结果

static public Result getValidateError(BindingResult bindingResult) {

		if(bindingResult.hasErrors() == false)
			return null;

		Map<String,String> fieldErrors = new HashMap<String, String>();

		for(FieldError error : bindingResult.getFieldErrors()){
			fieldErrors.put(error.getField(), error.getCode() + "|" + error.getDefaultMessage());
		}

		Result ret = new Result(422, "输入错误"); //rfc4918 - 11.2. 422: Unprocessable Entity
		ret.putData("fieldErrors", fieldErrors);

		return ret;
	}

Result是结果封装类,[spring boot 接口返回值封装] 那一篇中已经介绍过。

运行

Eclipse左侧,在项目根目录上点击鼠标右键弹出菜单,选择:run as -> spring boot app 运行程序。 打开Postman访问接口,运行结果如下:

输入错误的情况

输入正确的情况

总结

完整代码

到此这篇关于spring boot输入数据校验(validation)的文章就介绍到这了,更多相关spring boot数据校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot @Validated注解实现参数分组校验的方法实例

    前言 在前后端分离开发的时候我们需要用到参数校验,前端需要进行参数校验,后端接口同样的也需要,以防传入不合法的数据. 1.首先还是先导包,导入pom文件. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.解释一下注解的作用 @N

  • 详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收BindingResult,从而进行校验. eg: if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); List<String> errorlists = new ArrayList

  • Spring boot通过切面,实现超灵活的注解式数据校验过程

    目录 通过切面,实现超灵活的注解式数据校验 Spring MVC的校验方式 通过切面实现自己的注解式数据校验 Spring boot aop注解数据权限校验 注解类 AOP切面 使用 通过切面,实现超灵活的注解式数据校验 在企业系统的开发中,用户表单输入的场景是会经常遇见的,如何让数据校验脱离于业务代码逻辑,谁也不想在逻辑代码里对字段逐一判断.... Spring MVC的校验方式 在使用Spring MVC时的时候,直接使用hibernate-validator的注解,如下: public c

  • Spring Boot 通过注解实现数据校验的方法

    一.依赖 <!--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> &l

  • spring boot输入数据校验(validation)的实现过程

    项目内容 实现一个简单的用户注册接口,演示怎样进行数据校验. 要求 JDK1.8或更新版本 Eclipse开发环境 如没有开发环境,可参考 [spring boot 开发环境搭建(Eclipse)]. 项目创建 创建spring boot项目 打开Eclipse,创建spring boot的spring starter project项目,选择菜单:File > New > Project ...,弹出对话框,选择:Spring Boot > Spring Starter Project

  • Spring Boot参数校验及分组校验的使用教程

    目录 一  前言 1  什么是validator 二  注解介绍 1  validator内置注解 三  使用 1  单参数校验 2  对象参数校验 3  错误消息的捕获 总结 一  前言 做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验.格式校验等.如果参数比较少的话还是容易处理的一但参数比较多了的话代码中就会出现大量的if-else语句. 使用这种方式虽然简单直接,但是也有不好的地方,一是降低了开发效率,因为我们需要校验的参数会存在很多

  • spring boot基于DRUID实现数据源监控过程解析

    这篇文章主要介绍了spring boot基于DRUID实现数据源监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高.今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但

  • vue+spring boot实现校验码功能

    本文实例为大家分享了vue+spring boot实现校验码功能的具体代码,供大家参考,具体内容如下 用vue写了一个校验码来玩玩,样子如下: 1.img标签 <img ="height:40px; width: 100px; cursor: pointer;" ref="imgIdentifyingCode" :src="selectedLogoPicture.imgUrl" class="logoImg" >

  • Spring Boot 参数校验的具体实现方式

    1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spring Boot文档中的Validation 在Spring Boot的官网中,关于Validation只是简单的提了一句,如下 其实,Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator 3.

  • Spring Boot Redis客户端远程操作实现过程解析

    在Spring Boot 1.x中默认是Jedis作为客户端,但是在Spring Boot2.x后,默认就是Lettuce Redis的远程连接,默认是不支持的,需要手动开启 修改config文件: 注释掉bind:127.0.0.1 开启密码校验,去掉requireprass的注释 使用jedis客户端: jedis的GitHub地址:https://github.com/xetorthio/jedis 如何远程连接: //构造一个jedis对象 Jedis jedis=new Jedis("

  • Spring Boot 2和Redis例子实现过程解析

    这篇文章主要介绍了Spring Boot2发布与调用REST服务过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Redis是一个key-value数据库,支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在Java中,使用较为广泛的客户端有Redisson.Jedis.Spring Data Redis模块默认使用Jedis. 开发

  • Spring Boot构建优雅的RESTful接口过程详解

    RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是RESTful.需要注意的是,REST是设计风格而不是标准.REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准. 也许这段话有些晦涩难懂,换个角度

  • Spring Boot 2.X快速整合jpa过程解析

    一.JPA介绍 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. SpringData是Spring的一个子项目.用于简化数据库访问,支持NoSQL和关系数据存储,其主要目标是使数据库的访问变得方便快捷. Spring Data JPA致力于减少数据访问层(DAO)的开发量,开发者唯一要做的就只是声明持久层的接口,其他都交给Spring Data JPA 来帮你完成!

  • Spring Boot设置支持跨域请求过程详解

    现代浏览器出于安全的考虑, HTTP 请求时必须遵守同源策略,否则就是跨域的 HTTP 请求,默认情况下是被禁止的,IP(域名)不同.或者端口不同.协议不同(比如 HTTP.HTTPS)都会造成跨域问题. 一般前端的解决方案有: ① 使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的 SRC 不受同源策略约束来跨域获取数据.缺点是需要后端配合输出特定的返回信息. ② 利用反应代理的机制来解决跨域的

随机推荐