我们知道,后端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即为“用户名过长”