【问题标题】:Java bean cascade validation customization using JSR 303/380使用 JSR 303/380 自定义 Java bean 级联验证
【发布时间】:2018-10-02 15:45:08
【问题描述】:

是否可以使用 @Valid 的 JSR 303/380 规范来替换、增加或拦截 java bean 级联验证。基本上,我想使用@Valid 注解对每个级联验证执行一些额外的处理。

【问题讨论】:

    标签: java validation javabeans bean-validation cascade


    【解决方案1】:

    确保你想要它。

    import org.springframework.beans.BeanUtils;
    import org.springframework.validation.Errors;
    import org.springframework.validation.FieldError;
    import org.springframework.validation.ValidationUtils;
    import org.springframework.validation.Validator;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.List;
    import java.util.Objects;
    
    
    public class JSR303CollectionListValidator implements Validator {
    
        private final Validator validator;
    
        public JSR303CollectionListValidator(LocalValidatorFactoryBean localValidatorFactoryBean) {
            this.validator = localValidatorFactoryBean;
        }
    
        @Override    
        public boolean supports(Class clazz) {
            return clazz.isAssignableFrom(clazz);
        }
    
        @Override    
        public void validate(Object target, Errors errors) {
            ValidationUtils.invokeValidator(validator, target, errors);
    
            if(!target.getClass().isPrimitive()){
                PropertyDescriptor[] propertyDescriptors  = BeanUtils.getPropertyDescriptors(target.getClass());
    
                for(PropertyDescriptor descriptor : propertyDescriptors){
                    if(List.class.isAssignableFrom(descriptor.getPropertyType())){
                        Method method = descriptor.getReadMethod();
    
                        try {
                            Object object = method.invoke(target);
    
                            if(!Objects.isNull(object)){
                                List typeOfObject = (List) object;
    
                                for(Object resource : typeOfObject){
                                    validate(resource, errors);
                                }
                            }
                        } catch (IllegalAccessException | InvocationTargetException e) {
                            FieldError error = new FieldError(target.getClass().getSimpleName(), descriptor.getName()
                                  , "bean validation fail");
                            errors.getFieldErrors().add(error);
                        }
                    }
                }
            }
        }
    }
    

    注册 bean

    @ControllerAdvice
    public class WebDataBindHandler {
    
        @Inject
        private LocalValidatorFactoryBean localValidatorFactoryBean;
    
        @InitBinder
        void initBinder(WebDataBinder binder) {
            binder.addValidators(new JSR303CollectionListValidator(localValidatorFactoryBean));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2013-11-23
      • 2019-02-20
      • 2015-01-11
      • 2011-07-24
      相关资源
      最近更新 更多