Home >Java >javaTutorial >How does SpringBoot use validation for parameter verification?

How does SpringBoot use validation for parameter verification?

WBOY
WBOYforward
2023-05-21 11:10:101349browse

    1. Add dependencies

    Add hibernate-validator directly

    <dependency>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>6.0.2.Final</version>
            </dependency>

    Add spring-boot-starter-validation

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
                <version>1.4.0.RELEASE</version>
            </dependency>

    Add spring-boot-starter-web

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

    2. Configuration file

    If you want to set the fail_fast attribute, true means there is If a parameter fails, it will be returned. By default, all parameters are tested, so there must be a configuration file

    import org.hibernate.validator.HibernateValidator;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
    import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    /**
     * hibernate参数验证配置
     */
    @Configuration
    public class ValidatorConfig extends WebMvcConfigurerAdapter {
    
    
        @Bean
        public Validator validator() {
            ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                    .configure()
                    // 将fail_fast设置为true即可,如果想验证全部,则设置为false或者取消配置即可
                    .failFast(true)
    //                .addProperty("hibernate.validator.fail_fast", "true")
                    .buildValidatorFactory();
    
            return validatorFactory.getValidator();
        }
    
        /**
         * requestParam方式的校验
         * @return
         */
        @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
    
            MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
            methodValidationPostProcessor.setValidator(validator());
            return methodValidationPostProcessor;
        }
        @Override
        public org.springframework.validation.Validator getValidator() {
            return new SpringValidatorAdapter(validator());
        }
    }

    The methodValidationPostProcessor works on requestParam

    Inheritance WebMvcConfigurerAdapter And rewrite the getValidator() method to let spring's request verification Validator use our validator above to make the set failFast take effect, For details, please refer to org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#mvcValidatorMethod

    3. Unified exception handling

    /**
         * hibernate-valid实体类形式接受参数验证失败
         * @param ex
         * @return
         */
        @ExceptionHandler(BindException.class)
        @ResponseBody
        public WebResult validationErrorHandler(BindException ex) {
            List<String> collect = ex.getBindingResult().getAllErrors()
                    .stream()
                    .map(ObjectError::getDefaultMessage)
                    .collect(Collectors.toList());
            return new WebResult(Errors.INCORRECT_PARAM_FORMAT.getError(), StringUtils.join(collect, ";"));
        }
    
        /**
         * hibernate-valid实体类形式接受参数验证失败
         * @param ex
         * @return
         */
        @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseBody
        public WebResult validationErrorHandler(MethodArgumentNotValidException ex) {
            List<String> collect = ex.getBindingResult().getAllErrors()
                    .stream()
                    .map(ObjectError::getDefaultMessage)
                    .collect(Collectors.toList());
            return new WebResult(Errors.INCORRECT_PARAM_FORMAT.getError(), StringUtils.join(collect, ";"));
    
        }
        /**
         * RequestParam方式参数校验
         * @param ex
         * @return
         */
        @ExceptionHandler(ConstraintViolationException.class)
        @ResponseBody
        public WebResult validationErrorHandler(ConstraintViolationException ex) {
            List<String> errorInformation = ex.getConstraintViolations()
                    .stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.toList());
            return new WebResult(Errors.INCORRECT_PARAM_FORMAT.getError(),StringUtils.join(errorInformation, ";"));
        }

    4.Use

    If @RequestParam is used to directly write parameter verification, add the Validated annotation to the class or corresponding method. If the entity class accepts it, add the Validated annotation to the parameter. Just add

    @Valid
    before the entity in ######

    The above is the detailed content of How does SpringBoot use validation for parameter verification?. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete