源码地址
https://gitee.com/gaoxinfu_admin/open-source/blob/master/spring/spring-framework-5.0.2.RELEASE-%E4%B8%AD%E6%96%87%E6%B3%A8%E9%87%8A%E7%89%88/demo-spring-context/src/main/java/com/gaoxinfu/demo/spring/context/validation/BindingResultDemo.java
pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<groupId>com.gaoxinfu.demo.spring.context</groupId>
<artifactId>demo-spring-context</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo-spring-context Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<finalName>demo-spring-context</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
BindingResultDemo
package com.gaoxinfu.demo.spring.context.validation;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.*;
import java.math.BigDecimal;
/**
* @Description:
* @Author: gaoxinfu
* @Date: 2021-01-13 10:56
* @see BindingResult
*/
@RestController
@RequestMapping(path = "/BindingResult")
public class BindingResultDemo {
@PostMapping(path = "/sayHello")
public String sayhello(@Validated @RequestBody Greeting greeting, BindingResult greetingBindingResult){
if (greetingBindingResult.hasErrors()){
return "参数校验不通过:"+greetingBindingResult.getFieldError().getDefaultMessage();
}
return "参数校验通过";
}
}
@Data
class Greeting {
@NotBlank(message = "name姓名字段不能为空")
private String name;
/**
* @Digits
* integer:此数字接受的最大整数位数
* fraction:小数位数接受的最大位数
*
* 从下到上执行验证
*/
@Digits(message = "得分分数只能是2位整数,并且不能有小数", integer =2 , fraction =0 )
@NotNull(message = "score不能为空")
private BigDecimal score;
@Max(value = 100,message = "最大年龄不能超过100岁")
@Min(value = 18,message = "最小年龄不能超过18岁")
@NotNull(message = "age不能为空")
private Integer age;
@Email(message = "邮箱格式不正确")
@NotBlank(message = "邮箱不能为空")
private String email;
@DateTimeFormat(pattern ="yyyy-MM-dd")
@NotBlank(message = "出生日期不能为空")
private String birthDate;
}
解析
定义Greeting
1.我们对应Greeting这个对象里的每个字段进行了注解,这里的注解实际上是一个参数校验的过程,那么这个参数校验是如何生效的呢?
实际上是通过BindingResultDemo.sayhello方法中的@Validated(我们也可以用 javax.validation.Valid 即@Valid)去触发校验,
一般@Validated与BindingResult是组合使用,BindingResult实际上是接收参数校验的一个结果
2.我们通过 BindingResult里的FieldError去获取失败的原因
请求样例