2014-02-17 20 views
0

是否可以驗證一個bean,確保至少三個字段中的一個不爲空而不實現自定義驗證器?組驗證

所以:

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不爲null。

乾杯,

+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

@Ricky您的問題有誤導性,如果您需要驗證所有這三種方法,那麼您需要開箱即用的方法自己實施驗證器。我會爲您提供解決方案 – Jaiwo99

+0

我沒有測試過您的實施,但是通過實施我的一半,他們看起來非常相似。感謝您的幫助。我想我的問題是,如果這裏已經有什麼東西了。有沒有感到有點傷心。 – ricardoespsanto

0

看看@Valid和@Validated註解你的類

+0

我有,但那就是......我已經在使用@Validated來處理那種行爲,我想要某些東西被驗證一些,但不是其他的。我在這裏想要說的是,所有這些字段必須立即進行驗證,並且其中至少有一個必須不爲空 – ricardoespsanto