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 ...
随机推荐
- web开发下载文件夹
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...
- 7zip使用相关
造冰箱的大熊猫@cnblogs 2019/11/2 1.仅存储不压缩 7z a -mx0 compressed.7z FileFolderPath 将FileFolderPath指向的文件或文件夹打包 ...
- 数据结构实验之栈与队列四:括号匹配(SDUT 2134)
#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; ...
- pandas常用操作命令大全
网上的有个别不对 实际敲了一下 有补充了点常用的环境IDE anaconda python3.7 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 s:任意的 ...
- League of Leesins
C - League of Leesins 首先找到每一串数字的头和尾两个数字,这两个数字有一个特点,就是它们在输入数据的时候都只会出现一次.我们在输出的时候用头和尾做第一数都可以. 然后第二个数只会 ...
- springboot工程打成war包
1.将pom.xml中默认的jar修改为war. <packaging>war</packaging> 2.排除SpringBoot内置的Tomcat容器. <depen ...
- mysql启动关闭脚本
#!/bin/sh mysql_port= mysql_username="root" mysql_password="" function_start_mys ...
- golang中文件以及文件夹路径相关操作
获取目录中所有文件使用包: io/ioutil 使用方法: ioutil.ReadDir 读取目录 dirmane 中的所有目录和文件(不包括子目录) 返回读取到的文件的信息列表和读取过程中遇到的任何 ...
- pwn学习日记Day14 《程序员的自我修养》读书笔记
目标文件:计算机科学中存放目标代码的计算机文件,包含着机器代码,代码在运行时使用的数据,调试信息等,是从源代码文件产生程序文件这一过程的中间产物. 目标代码(objectcode)指计算机科学中编译器 ...
- QT 自定义消息
#define TEST_EVENT QEvent::User + 100 class CVxActuatorMain : public QMainWindow { protected: ...