SpringMVC中使用@Valid和BindingResult進行參數驗證


我們知道,后端Controller層一般是第一層被調用,它用來接收參數以及轉發,那么參數的校驗也就在這一層,例如非空和格式校驗等等。

  • 手動驗證
public String validPhone(String phone){
     if(null == phone){
           return "手機號不能為空!"
     }else{
           *****;
     }
}

現在我們有了新的驗證方式

  • 使用@Valid進行驗證

首先導入包bean-validator.jar或添加Maven依賴

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

在需要進行校驗的實體類上加上注解,校驗相關信息。

public class UserDto {
    @Length(max = 50,message = "用戶名過長")
    private String username;

    @NotBlank(message = "昵稱不能為空")
    @Length(max = 100,message = "昵稱過長")
    private String nickname;

    @NotBlank(message = "密碼不能為空")
    @Length(min = 5,max = 20,message = "密碼長度在5-20之間")
    private String password;

    @NotBlank(message = "手機號不能為空")
    @Pattern(regexp = ChengfengConstant.Validation.PHONE_REGEX,message = "手機號格式不正確")
    private String phone;

還必須在Controller中傳入參數加入注解@Valid

 @ResponseBody
public ResponseResult registryUserInfo(@Valid @RequestBody UserDto userDto,BindingResult result){
       ****;
}

這樣在controller方法中如果參數不符合校驗規則,則會拋出異常

 

如果想要完善校驗,如果校驗不符合返回前端相關信息,則需要用到BindingResult

  • BindingResult用法
@ResponseBody
public Map<String,Object> registryUserInfo(@Valid @RequestBody UserDto userDto,BindingResult result){
       if(result.hasErrors()){
              List<ObjectError> ls = result.getAllErrors();
       }
       Map<String,Object> map = new HashMap<String,Object>();
       for(int i = 0; i < ls.size(); i++){
              map.put("message", ls.get(i).getDefultMessage());
       }
       return map;
    }

這樣,即可返回在實體類中相關屬性上注解中的message

例如:

@Length(max = 50,message = "用戶名過長")

 private String username;

返回的message即為“用戶名過長”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM