SpringMVC系列--參數驗證--實例

其他網址

使用@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結果 

測試3form-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結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章