spring效验
相关依赖
如果开发普通 Java 程序的的话,你需要可能需要像下面这样依赖:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.9.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
实体类
package com.test.valid.entity; import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size; public class Person { @NotNull(message = "id字段不能为空")
private String id; @Size(max = 20)
@NotNull(message = "name字段不能为空")
private String name; @Pattern(regexp = "((^Man$|^Woman$|^UGM$))",message = "sex字段只能是Man、Woman、UGM")
@NotNull(message = "sex字段不能为空")
private String sex; @Email(message = "email格式不正确")
@NotNull(message = "email不能为空")
private String email; public Person() { } public Person(String id, String name, String sex, String email) {
this.id = id;
this.name = name;
this.sex = sex;
this.email = email;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
}
}
JSR提供的校验注解:
@Null被注释的元素必须为 null@NotNull被注释的元素必须不为 null@AssertTrue被注释的元素必须为 true@AssertFalse被注释的元素必须为 false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max=, min=)被注释的元素的大小必须在指定的范围内@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内@Past被注释的元素必须是一个过去的日期@Future被注释的元素必须是一个将来的日期@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
Hibernate Validator提供的校验注解:
@NotBlank(message =)验证字符串非null,且长度必须大于0@Email被注释的元素必须是电子邮箱地址@Length(min=,max=)被注释的字符串的大小必须在指定的范围内@NotEmpty被注释的字符串的必须非空@Range(min=,max=,message=)被注释的元素必须在合适的范围内
验证Controller的输入
验证请求体(RequestBody)
我们在需要验证的参数上加上了@Valid注解,如果验证失败,它将抛出MethodArgumentNotValidException。默认情况下,Spring会将此异常转换为HTTP Status 400(错误请求)。
package com.test.valid.controller; import com.test.valid.entity.Person;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import javax.validation.Valid;
import javax.validation.constraints.Max; @Validated
@RestController
@RequestMapping("/valid")
public class PersonController { @PostMapping("/person")
public ResponseEntity<Person> getPerson(@Valid Person person) {
return ResponseEntity.ok().body(person);
} @GetMapping("/person/{id}")
public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Max(value = 5,message = "超过 id 的范围了") Integer id) {
return ResponseEntity.ok().body(id);
}
}
测试验证:


{
"timestamp": "2019-10-25T03:05:15.018+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Email.person.email",
"Email.email",
"Email.java.lang.String",
"Email"
],
"arguments": [
{
"codes": [
"person.email",
"email"
],
"arguments": null,
"defaultMessage": "email",
"code": "email"
},
[],
{
"defaultMessage": ".*",
"codes": [
".*"
],
"arguments": null
}
],
"defaultMessage": "email格式不正确",
"objectName": "person",
"field": "email",
"rejectedValue": "123.com",
"bindingFailure": false,
"code": "Email"
}
],
"message": "Validation failed for object='person'. Error count: 1",
"path": "/valid/person"
}
验证请求参数(Path Variables 和 Request Parameters)
controller:
一定一定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。
如上面的代码。

验证 Service 中的方法
我们还可以验证任何Spring组件的输入,而不是验证控制器级别的输入,我们可以使用@Validated和@Valid注释的组合来实现这一需求。
一定一定不要忘记在类上加上 Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。
自定义 Validator
package com.test.valid; import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RegionValidator.class)
@Documented
public @interface Region {
String message() default "Region 值不在可选范围内"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
package com.test.valid; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet; public class RegionValidator implements ConstraintValidator<Region, String> {
public void initialize(Region constraint) {
} public boolean isValid(String obj, ConstraintValidatorContext context) {
HashSet<Object> regions = new HashSet<>();
regions.add("China");
regions.add("China-Taiwan");
regions.add("China-HongKong");
return regions.contains(obj);
}
}
@Region
private String region;

{
"timestamp": "2019-10-25T03:20:28.459+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Region.person.region",
"Region.region",
"Region.java.lang.String",
"Region"
],
"arguments": [
{
"codes": [
"person.region",
"region"
],
"arguments": null,
"defaultMessage": "region",
"code": "region"
}
],
"defaultMessage": "Region 值不在可选范围内",
"objectName": "person",
"field": "region",
"rejectedValue": "China-shanghai",
"bindingFailure": false,
"code": "Region"
}
],
"message": "Validation failed for object='person'. Error count: 1",
"path": "/valid/person"
}
spring效验的更多相关文章
- spring理解
Struts与Hibernate可以做什么事? Struts,Mvc中控制层解决方案,可以进行请求数据自动封装.类型转换.文件上传.效验… Hibernate,持久层的解决方案:可以做到,把对象保存到 ...
- spring源码深度解析-1核心实现
xml配置文件的读取:1:通过集成字AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件2:通过Docum ...
- Spring基本使用方法_Bean对象
Spring基本使用方法_Bean对象 Struts与Hibernate可以做什么事? Struts MVC中控制层解决方案.可以进行请求数据自动封装,类型转换,文件上传,效验..... Hibern ...
- spring使用中问题汇总
1.配置文件找不到beans元素:可能是xsd与spring版本不一致,导致无法效验: 解决方案:将applicationContext.xml中xsd文件定义的版本改为spring jar包中定义的 ...
- Spring的控制反转和依赖注入
Spring的官网:https://spring.io/ Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验… ...
- Spring知识结构
课程目标: 1. 回顾 * 传统的开发模式 * Struts与Hibernate可以做什么事? ...
- Spring框架引入
Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验… Hibernate, 持久层的解决方案: 可以做到, 把对 ...
- Spring中applicationContext.xml的bean里的id和name属性区别
转自:http://www.cnblogs.com/ztf2008/archive/2009/02/11/1388003.html <beans><bean id="per ...
- Spring IOC、对象依赖关系
Spring IOC.对象依赖关系 2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...
随机推荐
- C# 任务、线程、同步(五)
1.数据流使用 TPL Data Flow 类库 class Program { static void Main(string[] args) { // ActionBlock(); // Sou ...
- 下载文件设置header的filename要用ISO8859-1编码的原因
很多情况下,我们在写程序的时候都会把代码设置为UTF-8的编码,可以在下载文件设置filename的时候却有违常理,竟然设置编码格式为ISO8859-1,代码如下(如是英文的话就不需要这样处理了): ...
- 023_统计当前 Linux 系统中可以登录计算机的账户有多少个
#!/bin/bash #方法 1: grep "bash$" /etc/passwd | wc -l #方法 2: #-F END都要大写! awk -F: '/bash$/{x ...
- SharePoint學習
1.SharePoint 2010 Products -> SharePoint 2010 Products Configuration Wizard 配置好后,系統會自動在localho ...
- luogu 3998 [SHOI2013]发微博 map
考试的时候被卡常了~ code: #include <bits/stdc++.h> #define ll long long #define N 200002 #define setIO( ...
- 删除git中无用的大文件
推荐阅读:为什么你的 Git 仓库变得如此臃肿 有时候我们不小心提交了一些大文件上去,后来删除了,但是已经于事无补了,整个git的提及已经蹭蹭上去了. 这个时候怎么办呢? 1. 查看有哪些大文件(to ...
- CF1214B
CF1214B 解法: 暴力枚举,时间复杂度 $ O(n) $ CODE: #include<iostream> #include<cstdio> #include<cs ...
- Atcoder ABC 139A
Atcoder ABC 139A 题意: 给你两个字符串,记录对应位置字符相同的个数 $ (n=3) $ 解法: 暴力枚举. CODE: #include<iostream> #inclu ...
- ajax 的 get 方式
因为如果使用ajax 的 get 方式提交数据到后台controller的时候可能会出现缓存而无法提交的现象. 解决这类问题的方法有两种: 1.在ajax的url后面添加一个随机参数如 URL+&qu ...
- Apache Flink - 基本API概念
Flink程序是实现分布式集合转换的常规程序.集合最初是从源创建的.通过接收器(slink)返回结果,接收器可以将数据写到某个文件或stdout.Flink可以在各种环境(context)中运行,本地 ...