其他網址
使用@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結果