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

网友投稿 286 2022-12-07

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的内容

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

com.qikegu

springboot-validation-demo

0.0.1-SNAPSHOT

springboot-validation-demo

Demo project for Spring eVfGyBoot

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

com.qikegu

springboot-validation-demo

0.0.1-SNAPSHOT

springboot-validation-demo

Demo project for Spring eVfGyBoot

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

代码实现

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

创建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个成员变量:mobile,nickname, password,这些变量都带有注解:

@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 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(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 fieldErrors = new HashMap();

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访问接口,运行结果如下:

输入错误的情况

输入正确的情况

总结

完整代码

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot接口返回结果封装方法实例详解
下一篇:深入理解JAVA基础类库中对象Object类
相关文章

 发表评论

暂时没有评论,来抢沙发吧~