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即为“用户名过长”

猜你喜欢

转载自www.cnblogs.com/wulachen/p/10696428.html