Spring Boot 集成教程


web项目中,用户的输入总是被假定不安全不正确的,在被处理前需要做校验。本文介绍在spring boot项目中实现数据校验的过程。

项目内容

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

要求

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.qikegu</groupId>
  12. <artifactId>springboot-validation-demo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springboot-validation-demo</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. </dependency>
  29. </dependencies>
  30. <build>
  31. <plugins>
  32. <plugin>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-maven-plugin</artifactId>
  35. </plugin>
  36. </plugins>
  37. </build>
  38. </project>

代码实现

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

创建RegisterRequest

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


  1. public class RegisterRequest {
  2. @SuppressWarnings("unused")
  3. private static final org.slf4j.Logger log = LoggerFactory.getLogger(RegisterRequest.class);
  4. @NotNull(message="手机号必须填")
  5. @Pattern(regexp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$", message="账号请输入11位手机号") // 手机号
  6. private String mobile;
  7. @NotNull(message="昵称必须填")
  8. @Size(min=1, max=20, message="昵称1~20个字")
  9. private String nickname;
  10. @NotNull(message="密码必须填")
  11. @Size(min=6, max=16, message="密码6~16位")
  12. private String password;
  13. public String getMobile() {
  14. return mobile;
  15. }
  16. public void setMobile(String mobile) {
  17. this.mobile = mobile;
  18. }
  19. public String getNickname() {
  20. return nickname;
  21. }
  22. public void setNickname(String nickname) {
  23. this.nickname = nickname;
  24. }
  25. public String getPassword() {
  26. return password;
  27. }
  28. public void setPassword(String password) {
  29. this.password = password;
  30. }
  31. }

说明

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

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

创建控制器

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

  1. package com.qikegu.demo.controller;
  2. import javax.validation.Valid;
  3. import org.springframework.http.HttpStatus;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.validation.BindingResult;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import com.qikegu.demo.common.util.MiscUtil;
  11. import com.qikegu.demo.common.util.Result;
  12. import com.qikegu.demo.model.RegisterRequest;
  13. @RestController
  14. @RequestMapping("/auth")
  15. public class AuthController {
  16. @RequestMapping(value = "/register", method = RequestMethod.POST, produces="application/json")
  17. public ResponseEntity<Result> register(
  18. @Valid @RequestBody RegisterRequest register,
  19. BindingResult bindingResult
  20. ) {
  21. if(bindingResult.hasErrors()) {
  22. //rfc4918 - 11.2. 422: Unprocessable Entity
  23. // res.setStatus(422);
  24. // res.setMessage("输入错误");
  25. // res.putData("fieldErrors", bindingResult.getFieldErrors());
  26. Result res1 = MiscUtil.getValidateError(bindingResult);
  27. return new ResponseEntity<Result>(res1, HttpStatus.UNPROCESSABLE_ENTITY);
  28. }
  29. Result res = new Result(200, "ok");
  30. return ResponseEntity.ok(res);
  31. }
  32. }

说明

方法register有2个参数

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

辅助类 MiscUtil,Result

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

  1. static public Result getValidateError(BindingResult bindingResult) {
  2. if(bindingResult.hasErrors() == false)
  3. return null;
  4. Map<String,String> fieldErrors = new HashMap<String, String>();
  5. for(FieldError error : bindingResult.getFieldErrors()){
  6. fieldErrors.put(error.getField(), error.getCode() + "|" + error.getDefaultMessage());
  7. }
  8. Result ret = new Result(422, "输入错误"); //rfc4918 - 11.2. 422: Unprocessable Entity
  9. ret.putData("fieldErrors", fieldErrors);
  10. return ret;
  11. }

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

运行

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

输入错误的情况

输入正确的情况

总结

完整代码

spring boot输入数据校验(validation)的更多相关文章

  1. Spring Boot 参数校验

    1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spr ...

  2. Validated 注解完成 Spring Boot 参数校验

    1.  @Valid 和 @Validated @Valid 注解,是 Bean Validation 所定义,可以添加在普通方法.构造方法.方法参数.方法返回.成员变量上,表示它们需要进行约束校验. ...

  3. 59. Spring Boot Validator校验【从零开始学Spring Boot】

    大纲: (1) 入门例子: (2) 国际化: (3) 在代码中添加错误信息: (1) 入门例子: Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数 ...

  4. Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  5. Spring Boot参数校验

    1. 概述 作为接口服务提供方,非常有必要在项目中加入参数校验,比如字段非空,字段长度限制,邮箱格式验证等等,数据校验常用到概念:JSR303/JSR-349: JSR303是一项标准,只提供规范不提 ...

  6. spring boot集成mybatis(1)

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  7. spring boot配置druid连接池连接mysql

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  8. spring boot 连接Mysql介绍

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  9. Spring Boot Hello World (restful接口)例子

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

随机推荐

  1. SQLI_LAB------level 1

    SQLI_LAB 刷题刷题刷题!!! 知识扩展: SQL 1)SQL注入介绍 SQLI,sql injection,我们称之为 sql 注入.何为 sql,英文:Structured Query La ...

  2. 回过头来看一看过去20年的十大IT趋势

    导读 这是一个概念,不是一个事物.其实,可以认为当组织的数据增长速度超过IT部门的管理能力时,大数据就开始了.此前,计算机部门的工作人员过去常常按时下班,除非是在灭火或编写代码的时候.而现在,数据管理 ...

  3. sslopen RSA加解密

    一.  原理概念 OpenSSL定义: OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其 ...

  4. Unable to execute dex:Multuple dex files define 解决方法

    困扰我两天的问题终于解决了,在网上查的方法无非有三种 一. Eclipse->Project->去掉Build Automatically->Clear ->Build Pro ...

  5. leetCode242 有效的字母异位词

    引言: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram&qu ...

  6. oracle进入CDB

    第一步:使用sys登陆 CONN sys/change_on_install AS SYSDBA; 第二步:查看现在的容器名称 SHOW con_name; 第三步:改变容器为PDB ALTER SE ...

  7. PHPmyadmin Getshell(10.25 第二十七天)

    PHPmyadmin Getshell的方法(1)show global variables like '% secure-file-priv%' 如果该参数设置为空或者指定的文件夹可以利用,然后写木 ...

  8. POJ 3321:Apple Tree 树状数组

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22131   Accepted: 6715 Descr ...

  9. vim快速跳转到某一行

    在vim命令行模式下输入 : n(行数)  |

  10. pixi的图片处理

    pixi的图片处理   var texture = PIXI.Texture.fromImage('sprite.png');var sprite = new PIXI.Sprite(texture) ...