springboot统一校验validator实现

博客介绍了Java使用Validator框架进行参数校验的步骤,包括在pom.xml引入依赖、配置校验规则、编写手动验证类、创建统一异常处理类、添加实体bean校验规则、在controller中添加校验方法,最后使用swagger进行测试,还提及了遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:

pom.xml需引入spring-boot-start-web依赖,其中包含validator框架包

<!--Spring Boot Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

第二步:

配置validator,校验规则

@Configuration
public class ValidatorConfig {
    
    @Bean
    public Validator validator(){
        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
                .configure() // true-快速失败返回模式    false-普通模式
                .addProperty( "hibernate.validator.fail_fast", "true" )
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        return validator;
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        /**设置validator模式为快速失败返回*/
        postProcessor.setValidator(validator());
        return postProcessor;
    }
}

 

第三步:

编写手动验证类,验证失败时,以异常抛出

public class ValidateUtil {

    /**
     * 实体校验
     *
     * @param obj
     * @throws EddueException
     */
    public static <T> void validate(T obj) throws EddueException {
        Validator validator = SpringContextUtil.getBean(Validator.class);
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj, new Class[0]);
        if (constraintViolations.size() > 0) {
            ConstraintViolation<T> validateInfo = (ConstraintViolation<T>) constraintViolations.iterator().next();
            // validateInfo.getMessage() 校验不通过时的信息,即message对应的值
            throw new EddueException(CodeEnum.SYS_PARAM.getCode(), validateInfo.getMessage());
        }
    }
}

 

第四步:

创建统一异常处理类,分别对方法参数异常、实体bean参数处理

@ControllerAdvice
public class GlobalExceptionHandler {
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * @param e
     * @return com.eddue.datav.base.ResponseResult
     * @description 方法参数异常处理
     */
    @ExceptionHandler(value = {ConstraintViolationException.class})
    @ResponseBody
    public ResponseResult handleResourceNotFoundException(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
        StringBuilder strBuilder = new StringBuilder();
        for (ConstraintViolation<?> violation : violations) {
            strBuilder.append(violation.getMessage());
        }
        return ResponseResult.builder().code(CodeEnum.SYS_SERVER_ERROR.getCode()).msg(strBuilder.toString()).build();
    }

    /**
     * @param ex
     * @return com.eddue.cloudteacher.exception.ResponseResult
     * @description 实体bean参数异常处理
     */
    @ExceptionHandler(EddueException.class)
    @ResponseBody
    public ResponseResult eddueExceptionHandler(EddueException ex) {
        return ResponseResult.builder().code(ex.code).msg(ex.getMessage()).build();
    }
}

 

第五步:

创建测试实体bean,并添加校验规则

@ApiModel(value="systemParam",description="用户登录参数")
public class UserLoginRequest extends AbstractSystemParam {
    @NotEmpty(message = "手机号码不能为空")
    @ApiModelProperty(value="手机号",name="mobile")
    private String mobile;

    @NotEmpty(message = "密码不能为空")
    @ApiModelProperty(value="密码",name="mobile")
    private String password;

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 

第六步:

在controller中,添加方法和实体bean参数校验方法

@GetMapping(value = "/test")
@ApiOperation("测试")
public ResponseResult login(@NotEmpty(message = "不能为空")@RequestParam("test") String test) {
   return ResponseUtil.success();
}

@GetMapping(value = "/login")
@ApiOperation("登录")
public ResponseResult login(UserLoginRequest request) {
   ValidateUtil.validate(request);
   return null;
}

 

第七步:

使用swagger进行测试

134c9ee6d634ad6be2c145d45f1198936c2.jpg

981eb7cd26579ab78cdbe31c781dfd1aaf7.jpg

 

tips:本人尝试了各种方法实现,但是最后选择了该方案。因为我想实体bean生成的链接为&=?,在使用全部元注解形式时,出现swagger文档生成有误。

更加简单易用的方法,烦请大家可以告知,谢谢!

转载于:https://my.oschina.net/u/1017791/blog/3054515

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值