SpringBoot使用HibernateValidator分组校验实现参数校验排序

目录

 

一、需求

二、实现方式

三、实例

1增加配置文件使用快速失败模式

2创建测试实体类

3创建congtroller

4使用postman测试接口

四、解决排序问题

1新增注解

2修改Controller类

3修改实体类

4测试


一、需求

StringBoot开发POST接口使用HibernateValidator校验@RequestBody注解的参数时,需要对参数进行校验。使用快速失败返回模式(只要有一个验证失败,则返回)。需要控制校验字段的顺序。

二、实现方式

使用HibernateValidator的分组校验实现排序。

分组顺序校验时,按指定的分组先后顺序进行验证,前面的验证不通过,后面的分组就不行验证。

validate注解group属性不传时会调用默认的Default.class分组。

深入@Valid和@Validated的区别能更好的用不同的方法实现功能。(方案有很多种,实例只测试一种可行方案)

三、实例

新建一个普通的SpringBoot项目。

1增加配置文件使用快速失败模式

HibernateValidationConfig
package com.asyf.demo.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

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


@Configuration
public class HibernateValidationConfig {

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        /**默认是普通模式,会返回所有的验证不通过信息集合*/
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        /**设置validator模式为快速失败返回*/
        processor.setValidator(validator());
        return processor;
    }

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .failFast(true)
                .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
        return validator;
    }

}

2创建测试实体类

User

package com.asyf.demo.controller;

import javax.validation.constraints.NotBlank;

public class User {

    private String id;

    @NotBlank(message = "name不能为空")
    private String name;

    @NotBlank(message = "password不能为空")
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

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

3创建congtroller

DemoController

package com.asyf.demo.controller;

import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.Date;

@RestController(value = "/")
@Validated
public class DemoController {

    @RequestMapping(value = "demo", method = RequestMethod.POST)
    public String test(@Valid @RequestBody User user, BindingResult bindingResult) {
        String str = new Date().toString();
        return str;
    }

}

4使用postman测试接口

结果不正确,应该优先验证name属性。

四、解决排序问题

1新增注解

package com.asyf.demo.annotation;

public interface Name {
}
package com.asyf.demo.annotation;

public interface Password {
}
package com.asyf.demo.annotation;

import javax.validation.GroupSequence;

@GroupSequence({Name.class, Password.class, Default.class})
public interface UserSequence {
}

注意:Default.class必须添加,否则id属性不会校验。(validate注解group属性不传时会调用默认的Default.class分组)

2修改Controller类

3修改实体类

4测试

发布了35 篇原创文章 · 获赞 13 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/cs373616511/article/details/104376245