百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Springboot学习记录07 Springboot表单验证(validation check)

toyiye 2024-07-05 01:36 12 浏览 0 评论

本学习记录的代码,部分参考自gitee码云的如下两个工程。这两个个工程有详尽的Spingboot1.x和2.x教程。鸣谢!

https://gitee.com/didispace/SpringBoot-Learning.git

https://gitee.com/jeff1993/springboot-learning-example.git

本学习记录的示例代码克隆地址,分支为develop

https://gitee.com/kutilion/MyArtifactForEffectiveJava.git

表单验证

不可避免的,每一个实际web项目都需要进行表单验证。表单验证分为前台后台两种。

前台验证

由js或者其他的前台框架实现。主要是对表单输入数据的合法性检查。比如是不是必须项目,长度,类型。以及一些简单的相关验证,比如开始日期不能大于终了日期等。

后台验证

又分为与前台验证的重现和业务验证。之所以需要前台验证的重现,主要是考虑到安全性问题。业务验证各个项目都不相同,不在本章学习范围。本章主要学习使用Springboot的表单验证功能来进行后台验证。

用Springboot实现表单验证

使用Springboot进行表单验证,首先要在gradle.build中引入依赖spring-boot-starter-validation。但是在示例工程的gradle.build中找不到对它的引入。主要是因为这个starter被包含在了spring-boot-starter-web中。

示例工程表单验证相关代码列表如下:

  • studySpringboot.n07.validation.api.TestObjectRequest.java
  • studySpringboot.n07.validation.api.TestElement.java
  • studySpringboot.n07.validation.web.ValidationController.java
  • studySpringboot.n07.validation.annotation.PatternMatch.java

TestObjectRequest.java

这个类实际上是一个POJO。也是一个Java Bean。它的各个成员变量上,有关于针对该项目的表单验证注解。

// class defination not included
@Min(value = 1, message = "{ id must be greater then 0 }")
 @Max(value = 999, message = "{ id must be less then 999 }")
 private long id;
 @NotNull(message = "{ name is required }")
 @NotEmpty(message = "{ name can not be empty }")
 @Pattern(regexp = "[^\\u0000-\\u0008\\u000B-\\u000C\\u000E-\\u001F\\u0080-\\u009F]*",
 message = "{ id can not include tab or line break }")
 private String name;
 @Length(min = 5, max = 25,
 message = "{ the content size must be less than 25 but greater than 5 }")
 @PatternMatch(pattern="[a-zA-Z0-9]+", message="{ the content is not match the given pattern [a-zA-Z0-9]+ }")
 private String content;
 @Email(message = "this is not a validated email address")
 private String email;
 @Range(min = 1, max = 9999, message = "{ account must between 1 and 9999 }")
 private BigDecimal account;
 @Valid
 @Size(min = 1, max = 3,
 message = "{ the size of attributes list must be less than 3 and greater than 1 }")
 private List<TestElement> attributes;
// getters and setters not included

下面简单介绍一下各个注解的意义:

  • @Min 数值型的最小值
  • @Max 数值型的最大值
  • @NotNull 必须不为null
  • @NotEmpty 必须不为null且不为空字符串""
  • @NotBlank 必须不为空字符串""
  • @Pattern 必须符合regexp属性的正则表达式定义
  • @Length 字符串长度必须在min和max属性定义(含)之间
  • @Email 必须符合email的语法规则
  • @Range 数值范围必须在min和max属性定义(含)之间。它调用了@Min和@Max
  • @Size 容器的元素数量必须在min和maz属性定义(含)之间

注意,以上只列出了一些常用注解,而且说明都很简单。实际应用的时候最好先查阅一下各个注解的文档。而且在引入spring-boot-starter-web的同时,另外一个可以做表单验证的依赖hibernate-validator也会默认被引入。这个依赖中有一些与spring-boot-starter-validation相同的注解。要注意不要用错。在实际的工作中,经常会出现这样的问题。

仅仅将注解加到Bean类的成员变量上是不足以实现验证的。这还需要调用这个Bean的类的配合。

ValidationController.java

这是一个控制器类,它将TestObjectRequest.java类的对象作为表单提交时接收到的数据。

 @ApiOperation(value = "Create a new object", notes = "Put a new object in the map.")
 @RequestMapping(value = "/validate", method = RequestMethod.POST)
 public String postTestObject2(@Valid TestObjectRequest testObjectRequest) {
 TestObject testObject = new TestObject();
 testObject.setId(testObjectRequest.getId());
 testObject.setName(testObjectRequest.getName());
 testObject.setContent(testObjectRequest.getContent());
 
 testObjects.put(testObject.getId(), testObject);
 return "success";
 }

注意TestObjectRequest.java类的对象是postTestObject2方法的参数。这个参数之前有注解@Valid。@Valid注解告诉Springboot需要对这个参数进行表单验证。

还有另外一个注解@Validated可以用在这个地方。这两个注解的主要不同如下:

  • @Valid可以实现嵌套验证。参照TestObjectRequest.java的变量List<TestElement> attributes。声明@Valid会触发列表储存的对象Bean定义的各种验证
  • @Validated可以实现分组验证(没有提供示例)。分组后可以指定验证顺序等。这需要其他的验证注解的配合。@Min(value = 18, message = "any message", groups = {IGroupA.class})。其中的GroupA是一个空接口

下面用swagger来测试一下表单验证是否成功

图图图

自定义表单验证注解

TestObjectRequest.java的代码中,针对content成员变量的验证注解中有一个叫做@PatternMatch。这不是由spring-boot-starter-validation提供的。而是自定义的注解。通过自定义注解, 可以很方便的实现一些用户自己需要的特定表单验证。

自定义注解的基本知识这里不做学习,如果不清楚如何自定义注解,可以参照网上的其他技术文章。

PatternMatch.java

注解的定义。

@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PatternMatch.Validator.class)
@Documented
public @interface PatternMatch {
 String pattern();
 String message();
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
 public static class Validator implements ConstraintValidator<PatternMatch, String> {
 String pattern;
 String message;
 @Override
 public void initialize(PatternMatch annotation) {
 this.pattern = annotation.pattern();
 this.message = annotation.message();
 }
 @Override
 public boolean isValid(String value, ConstraintValidatorContext context) {
 return value == null
 || value.isEmpty()
 || value.matches(pattern);
 }
 }
}

@Constraint注解标识了验证所使用的类是PatternMatch.Validator。这个类注解作为内部静态类定义在PatternMatch.java中。如果不习惯使用静态类,也可以抽出。PatternMatch.Validator类实现了ConstraintValidator接口。所以需要重写接口的两个方法initialize和isValid。顾名思义initialize是初始化方法,将注解的属性赋值到类属性上。isValid是判断是否合法的方法。这里使用了String类的matches方法,来判断输入的字符串是不是符合正则表达式pattern。

下面我们用swagger试验一下效果

总结

  1. 使用spring-boot-starter-validation实现表单验证
  2. 熟悉各种常用验证注解
  3. 自定义表单验证注解并且使用它

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码