栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring Boot】3.2 Validation 数据验证的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring Boot】3.2 Validation 数据验证的使用

这篇文章应该在Retrofit 和 VerifyImageCode 之前

Validation 是用来验证前端用户输入数据合法性的组建,使用步骤如下

引入启动器
        
        
            org.springframework.boot
            spring-boot-starter-validation
        
创建一个配置类 定义异常快速返回
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;



@Configuration
public class ValidatorConfiguration {
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .addProperty("hibernate.validator.fail_fast", "true")
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        return validator;
    }
}
创建一个异常统一处理的配置类
import org.hibernate.validator.internal.engine.path.PathImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;



@RestControllerAdvice
public class ExceptionHandlerConfig {

    @Autowired
    private Result result;

    
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public Result exceptionHandler500(BindException e){
        // e.printStackTrace();
        StringBuilder stringBuilder = new StringBuilder();
        for (ObjectError error : e.getAllErrors()) {
            // stringBuilder.append(((FieldError) error).getField());
            stringBuilder.append(error.getDefaultMessage());
        }
        return result.failed(10003,stringBuilder.toString(), null);
    }

    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseBody
    public Result exceptionHandler500(ConstraintViolationException e){
        // e.printStackTrace();
        StringBuilder stringBuilder = new StringBuilder();
        for (ConstraintViolation error : e.getConstraintViolations()) {
            PathImpl pathImpl = (PathImpl) error.getPropertyPath();
            // String paramName = pathImpl.getLeafNode().getName();
            // stringBuilder.append(paramName);
            stringBuilder.append(error.getMessage());
        }
        return result.failed(10002,stringBuilder.toString(), null);
    }

    
    @ExceptionHandler(value =Exception.class)
    @ResponseBody
    public Result exceptionHandler(Exception e){
        // e.printStackTrace();
        return result.failed(10001,e.getMessage(), null);
    }
}
在Controller层的调用示例
    
    @PostMapping(value = "/smsCode")
    public Result getSmsCode(
            @NotBlank(message = "手机号码不能为空") @Pattern(regexp = "^\d{11}$", message = "手机号码应为11位数字") @RequestParam("uPhone") String uPhone,
            @NotBlank(message = "图片验证码不能为空") @Pattern(regexp = "^\d{4}$", message = "图片验证码应为4位数字") @RequestParam("imgCode") String imgCode,
            @NotBlank(message = "前端未传回Key值") @RequestParam("imgKey") String imgKey
    ){
        // 验证图片验证码是否正确
        if (verifyCodeImageUtil.checkImgCode(imgCode, imgKey)){
            return result.failed("图片验证码输入错误");
        }

        //调起service 获得短信发送的最终状态
        return publicService.getSmsCode(uPhone);
    }
另外一种调用和处理的方式(不依赖统一异常返回)
@PostMapping("save")
public void v1(@RequestBody @Valid AppUser appUser,BindingResult result){
      if(result.hasErrors()){
            for (ObjectError error : result.getAllErrors()) {
                System.out.println(error.getDefaultMessage());
            }
        }
}

上述例子的重点在于 在验证的字段之后,紧跟着 BindingResult 对象,这个对象是用来收集验证结果的,并将验证结果传入方法体中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006430.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号