【问题标题】:Field validation from options on condition from other field javax.validation来自其他字段 javax.validation 条件的选项的字段验证
【发布时间】:2019-04-11 12:16:01
【问题描述】:

如果存在另一个字段,我需要执行字段验证(它可以是值之一)。

import javax.validation.*;

class Person {

    @NotBlank
    private String name;

    private Long groupId;

    @Valid // if group id is not null, select one from available.
    private String specialization;

    // getters, setters.
}

class PersonValidaionLogic {

    @Autowired
    private SpecializationService specializationService;

    public void validatePerson(final Person person) {
        Long groupId = person.getGroupId();
        if (groupId != null) {
            Set<String> availableSpecializations = specializationService.getByGroupId(groupId);
            if (!availableSpecializations.contains(specialization)) {
                addValidationError("specialization is not valid");
            }
        }
    }
}

有一个nice answer on how to validate multiple fields in a class with conditions on each other

如何将specializationServicegroupId 传递给验证器。

【问题讨论】:

    标签: java validation bean-validation


    【解决方案1】:

    随时分享您的解决方案或想法!我就是这样解决这个问题的。

    我在我的问题中使用了链接中的想法,但方式更简单。

    首先,我解决了一个问题how to pass a Spring component or service into validator。我使用了一个包含对服务的静态引用的组件。

    其次,我验证了链接中描述的整个对象。

    这是代码!

    1) 创建注解@PersonConstraint 并放入Person 类。 这可能会有所帮助https://www.baeldung.com/javax-validation-method-constraints

    @Target({ TYPE })
    @Retention(RUNTIME)
    @Constraint(validatedBy = PersonValidator.class)
    public @interface PersonConstraint {
    
        String message() default "Specialization is not valid";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    
        CaseMode value();
    }
    

    2) 持有对服务的静态引用的组件。

    @Component // Spring component.
    class ServiceHolderComponent {
    
        private static SpecializationService SPECIALIZATION_SERVICE;
    
        @Autowired
        public ServiceHolderComponent(final SpecializationService specializationService) {
            GROUP_SERVICE = Validate.notNull(groupService); //apache lib
        }
    
        public static SpecializationService getSpecializationService() {
            return SPECIALIZATION_SERVICE;
        }
    }
    

    3) 和人员验证器

    public class PersonValidator implements ConstraintValidator<PersonConstraint, Person> {
    
        private final SpecializationService specializationService;
    
        public UserDynamicEnumValidator() {
            this(ServiceHolderComponent.getSpecializationService());
        }
    
        public UserDynamicEnumValidator(final SpecializationService specializationService) {
            this.specializationService = specializationService;
        }
    
        @Override
        public boolean isValid(final Person person, final ConstraintValidatorContext context) {
            final Long groupId = person.getGroupId();
            if (groupId == null) {
                return true; // We consider it valid.
            }
    
            final String specialization = person.getSpecializat();
            if (StringUtils.isEmpty(specialization)) {
                return true; // We consider it valid.
            }
    
            // I changed the code of the service, so it returns a set of strings - projection query and collectors to set.
            final Set<String> availableSpecializationValuesByGroup = specializationService.findByValue(groupId);
    
            if (!availableSpecializationValuesByGroup.contains(specialization)) {
                // To display custom message
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate("Specialization is not valid").addConstraintViolation();
                return false;
            }
    
            return true;
        }
    }
    

    要显示custom message in validator,请检查此

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      相关资源
      最近更新 更多