spring boot(八)——数据验证

前言

在默认情况下springboot会引入Hibernate Validator机制来支持JSR-303验证规范,另外一个方面我们偶尔也会自定义验证规则。

1、加上验证

这个操作比较简单,只需要在目标对象上加入注解即可,如下所示:

package com.learn.springauthserver.dto;

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;

import java.io.Serializable;

/**
 * autor:liman
 * createtime:2019/12/15
 * comment:
 */
@Data
public class UpdatePsdDto implements Serializable {

    @NotBlank(message="旧密码不能为空")
    private String oldPassword;

    @NotBlank(message="新密码不能为空")
    private String newPassword;

}

这里用到了lombok插件,左右直接省略了各种getter和setter方法,通过@NotBlank注解加入了针对这个字段的校验,

2、标示需要验证

在controller中,标示该对象为需要验证的对象,需要加入@Validated注解。

@RequestMapping(value = "/token/password/update", method = RequestMethod.POST)
public BaseResponse updatePassword(@RequestHeader String accessToken, @RequestBody @Validated UpdatePsdDto updatePsdDto
        , BindingResult bindingResult) {
    log.info("客户开始修改密码,需要失效之前的token");
    BaseResponse baseResponse = new BaseResponse(StatusCode.Success);
    try {
        if (StringUtils.isBlank(accessToken)) {
            return new BaseResponse(StatusCode.AccessTokenNotBlank);
        }
        //参数校验,加了@Validated注解的参数,校验的结果都会放到bindingResult中。
        String res = ValidatorUtils.checkResult(bindingResult);
        if (StringUtils.isNotBlank(res)) {
            return new BaseResponse(StatusCode.InvalidParams.getCode(), res);
        }
        //开始修改密码
        dbAuthService.updatePassword(accessToken,updatePsdDto);

    } catch (Exception e) {
        baseResponse = new BaseResponse(StatusCode.Fail, e.getMessage());
    }
    return baseResponse;
}

在UpdatePsdDto对象前加入了@Validted注解,标示这个参数会被校验,同时会增加BindingResult类型的参数,这个参数会自动存储校验的结果。我们后续获取该参数的验证信息,只需要处理这个参数即可。

3、获取验证信息

/**
 * autor:liman
 * createtime:2019/12/15
 * comment:统一参数校验工具
 */
public class ValidatorUtils {

    public static String checkResult(BindingResult result){
        StringBuilder stringBuilder = new StringBuilder("");
        if(result != null && result.hasErrors()){
            List<ObjectError> errors = result.getAllErrors();
            errors.forEach(error->stringBuilder.append(error.getDefaultMessage()).append("\n"));
        }
        return stringBuilder.toString();
    }

}

这个校验工具做的事情无非就是从BindingResult中获取校验结果。如果校验结果不为空,则表示校验未通过。可以进行相应的异常处理。 

总结

偏使用,没啥可总结的。

发布了129 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/liman65727/article/details/103743259