其他网址
使用@Valid+BindingResult进行controller参数校验__再见阿郎_的专栏-CSDN博客_@valid bindingresult
创建SpringBoot工程
gitee地址:https://gitee.com/shapeless/demo/tree/master/demo_springboot_mvc_validation
Entity
不分组的Entity
package com.example.demo.entity;
import com.example.demo.validatation.IGroupA;
import com.example.demo.validatation.IGroupB;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
public class User {
@NotBlank(message = "名字不能为空")
private String name;
private Integer age;
@NotEmpty(message = "密码不能为空")
private String[] password;
@NotEmpty(message = "分数不能为空")
private List<Integer> scoreArray;
@Valid
@NotNull(message = "账户不能为null")
private Account account;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPassword() {
return password;
}
public void setPassword(String[] password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<Integer> getScoreArray() {
return scoreArray;
}
public void setScoreArray(List<Integer> scoreArray) {
this.scoreArray = scoreArray;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
}
package com.example.demo.entity;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
public class Account implements Serializable {
@NotEmpty(message = "电话号码不能为空")
private String phoneNum;
private String[] emails;
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String[] getEmails() {
return emails;
}
public void setEmails(String[] emails) {
this.emails = emails;
}
}
分组的Entity
有修改:
package com.example.demo.entity;
import com.example.demo.validatation.IGroupA;
import com.example.demo.validatation.IGroupB;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
public class User {
@NotBlank(message = "名字不能为空")
private String name;
private Integer age;
@NotEmpty(message = "密码不能为空", groups = {IGroupA.class})
private String[] password;
@NotEmpty(message = "分数不能为空", groups = {IGroupB.class})
private List<Integer> scoreArray;
@Valid
@NotNull(message = "账户不能为null")
private Account account;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPassword() {
return password;
}
public void setPassword(String[] password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<Integer> getScoreArray() {
return scoreArray;
}
public void setScoreArray(List<Integer> scoreArray) {
this.scoreArray = scoreArray;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
}
无修改
package com.example.demo.entity;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
public class Account implements Serializable {
@NotEmpty(message = "电话号码不能为空")
private String phoneNum;
private String[] emails;
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String[] getEmails() {
return emails;
}
public void setEmails(String[] emails) {
this.emails = emails;
}
}
新加的
package com.example.demo.validatation;
public interface IGroupA {
}
package com.example.demo.validatation;
public interface IGroupB {
}
package com.example.demo.validatation;
import javax.validation.GroupSequence;
import javax.validation.groups.Default;
@GroupSequence({Default.class, IGroupA.class, IGroupB.class})
public interface IGroupAll {
}
@valid
引入hibernate-validator依赖
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.2.Final</version>
</dependency>
Controller
ValidController.java
package com.example.demo.controller;
import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
@Controller
@RequestMapping("/valid")
public class ValidController {
@RequestMapping("/1")
@ResponseBody
public User test1(@Valid @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
//printUser(user);
return user;
}
@RequestMapping("/2")
@ResponseBody
public User test2(@Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
//printUser(user);
return user;
}
@RequestMapping("/3")
@ResponseBody
public User test3(@Valid User user, List<Integer> scoreArray, BindingResult bindingResult) {
//System.out.println(scoreArray);
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
//printUser(user);
return user;
}
private void printUser(User user){
System.out.println("name : " + user.getName());
System.out.println("password : " + Arrays.asList(user.getPassword()));
System.out.println("scoreArray : " + user.getScoreArray());
System.out.println("acount.phoneNum : " + user.getAccount().getPhoneNum());
System.out.println("account.emails : " + Arrays.asList(user.getAccount().getEmails()));
}
}
不分组的Entity
测试(不分组)
测试1:最外层对象(User)包含空的子对象成员(account)
postman访问:http://localhost:8080/valid/1
请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
电话号码不能为空
分数不能为空
密码不能为空
名字不能为空
postman结果
测试2:最外层对象(User)不包含子对象成员(account)
postman访问:http://localhost:8080/valid/1
请求体
{
"age": 18,
"password": [
]
}
后端结果
名字不能为空
账户不能为null
密码不能为空
分数不能为空
postman结果
测试(分组)
测试1:IGroupA和IGroupB都没有验证。相当于@Valid对应Default.class的验证
postman访问:http://localhost:8080/valid/1
postman的请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
名字不能为空
电话号码不能为空
postman结果
测试3:form-data测试(成功):最外层对象(User)包含子对象成员(account)
postman访问:http://localhost:8080/valid/2
postman:
后端结果
名字不能为空
电话号码不能为空
测试4:form-data测试(结果如下):最外层对象(User)不包含子对象成员(account)
postman:
后端结果
Field error in object 'user' on field 'account.phoneNum': rejected value [null]; codes [NotEmpty.user.account.phoneNum,NotEmpty.account.phoneNum,NotEmpty.phoneNum,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.account.phoneNum,account.phoneNum]; arguments []; default message [account.phoneNum]]; default message [电话号码不能为空]
Field error in object 'user' on field 'name': rejected value [null]; codes [NotBlank.user.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [名字不能为空]]
@Validated
引入hibernate-validator依赖
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.2.Final</version>
</dependency>
Controller
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.validatation.IGroupA;
import com.example.demo.validatation.IGroupB;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Arrays;
import java.util.List;
@Controller
@RequestMapping("/validated")
public class ValidatedController {
@RequestMapping("/1")
@ResponseBody
public User test1(@Validated @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
return user;
}
@RequestMapping("/2")
@ResponseBody
public User test2(@Validated({IGroupA.class}) @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
return user;
}
@RequestMapping("/3")
@ResponseBody
public User test3(@Validated({IGroupB.class}) @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
return user;
}
@RequestMapping("/4")
@ResponseBody
public User test4(@Validated({IGroupA.class, IGroupB.class}) @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
List<ObjectError> list = bindingResult.getAllErrors();
for (ObjectError objectError : list) {
System.out.println(objectError.getDefaultMessage());
}
//System.out.println(bindingResult.getFieldError().getDefaultMessage());
}
System.out.println();
return user;
}
private void printUser(User user){
System.out.println("name : " + user.getName());
System.out.println("password : " + Arrays.asList(user.getPassword()));
System.out.println("scoreArray : " + user.getScoreArray());
System.out.println("acount.phoneNum : " + user.getAccount().getPhoneNum());
System.out.println("account.emails : " + Arrays.asList(user.getAccount().getEmails()));
}
}
测试(不分组)
测试1:相对于@Valid的测试,只将Controller的@Valid改为@Validated。结果:跟@Valid一样效果
postman访问:http://localhost:8080/validated/1
后端结果
分数不能为空
电话号码不能为空
密码不能为空
名字不能为空
postman结果
测试(分组)
测试1:IGroupA
postman访问:http://localhost:8080/validated/2
postman的请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
密码不能为空
postman结果
测试2:IGroupB
postman访问:http://localhost:8080/validated/3
postman的请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
分数不能为空
postman结果
测试3:IGroupA + IGroupB
postman访问:http://localhost:8080/validated/4
postman的请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
密码不能为空
分数不能为空
postman结果
测试(组序列)
测试1:Default.class, IGroupA.class, IGroupB.class(Default.class检测到了错误,后边的两个都不再验证了)
postman访问:http://localhost:8080/validated/5
postman的请求体
{
"age": 18,
"password": [
],
"account": {
}
}
后端结果
电话号码不能为空
名字不能为空
postman结果