2014-02-17 4 views
0

Можно ли проверить компонент, гарантирующий, что хотя бы одно из трех полей не является нулевым, без реализации пользовательского валидатора?Проверка группы

Итак:

public class Foo { 

    @NotNull(groups = {AtLeastOne.class}) 
    private Bar b1; 

    @NotNull(groups = {AtLeastOne.class}) 
    private Bar b2; 

    @NotNull(groups = {AtLeastOne.class}) 
    private Bar b3; 
} 

Но без групп это означает, что я хочу, чтобы проверить их все на одном дыхании. Я хочу, чтобы b1 или b2 или b3 не были нулевыми.

Приветствия,

+0

Нет HibernateValidator, но да JSR 303. – ricardoespsanto

ответ

1

Вам нужна аннотация @Validated. Пример:

public class Foo { 

    @NotNull(groups = {AtLeastOne.class}) 
    private Bar b1; 

    @NotNull(groups = {AtLeastTwo.class}) 
    private Bar b2; 

    @NotNull(groups = {AtLeastThree.class}) 
    private Bar b3; 
} 

@Validated(value=AtLeastOne.class) будет проверять только b1 @Validated(value=AtLeastTwo.class) будет проверять только b2

UPDATE

@NotAllNull(value={"b1", "b2", "b3"}) 
public class Foo { 

    private Bar b1; 

    private Bar b2; 

    private Bar b3; 
} 

@Documented 
@Constraint(validatedBy = NotAllNullValidator.class) 
@Target({ ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface NotAllNull { 
    String[] value; 
} 

public class NotAllNullValidator implements ConstraintValidator<NotAllNull, Object> { 

    private String[] fields; 

    @Override 
    public void initialize(final NotAllNull constraintAnnotation) { 
     fields = constraintAnnotation.value(); 
    } 

    @Override 
    public boolean isValid(final Object instance, final ConstraintValidatorContext context) { 
     boolean result = false; 
     for(int i = 0 ; i < fields.length; i++) { 
      result |= org.apache.commons.beanutils.BeanUtils.getProperty(instance, fields[i])!=null; 
     } 
     return result; 
    } 
} 

У меня нет IDE здесь, могут быть некоторые ошибки в коде, но надеюсь, что вы можете видеть идею за кодом

+0

Но я хочу проверить, что Foo имеет значение для b1 или b2 или b3. Я не хочу проверять, имеет ли значение b1 в некоторых обстоятельствах и b2 или b2 в других – ricardoespsanto

+1

@ Неверный ваш вопрос вводит в заблуждение, если вам нужно проверить все эти три, нет способа из коробки, вам нужно для выполнения своего валидатора самостоятельно. я дам вам решение – Jaiwo99

+0

Я не тестировал вашу реализацию, но был на полпути через реализацию моей ... они выглядят очень похожими. Спасибо за помощь. Я думаю, мой вопрос был действительно, если для этого уже было что-то. Немного грустно, что нет. – ricardoespsanto

0

взглянуть на @Valid и @Validated аннотации на вашем классе

+0

У меня есть это ... Я уже использую @Validated для такого поведения, когда я хочу, чтобы что-то проверялось несколько раз, но не другие. Я хочу здесь сказать, что все эти поля должны быть проверены сразу, и хотя бы один из них должен быть не равен – ricardoespsanto

Смежные вопросы