我們知道,后端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即為“用戶名過長”