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结果

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