2011-08-09 12 views
3

私はシンプルな豆、すなわち:クロスフィールド検証(JSR 303)問題

public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

を持っているので、selectedがtrueの場合、私はsomeString@NotNullなどになりたいです。

ヒントは、この動作を達成するためのヒントですか?あなたは、たとえば、カスタムバリデータでMyBeanに注釈を付けることによってこれを行うことができ

おかげ ジョニー

+1

[Hibernate Validator(JSR 303)でのクロスフィールド検証]の複製可能性(http://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303) –

答えて

2

@ValidMyBean 
public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

ValidMyBean:

@Target({ ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = MyBeanValidator.class) 
public @interface ValidMyBean { 

    boolean allViolationMessages() default true; 

    Class<?>[] constraints() default {}; 

    Class<?>[] groups() default {}; 

    String message() default "{ValidMyBean.message}"; 

    Class<? extends Payload>[] payload() default {}; 
} 

MyBeanValidator:

public final class MyBeanValidator implements 
     ConstraintValidator<ValidMyBean, MyBean> { 

    @Override 
    public void initialize(
      @SuppressWarnings("unused") final ValidMyBean constraintAnnotation) { 
    } 

    @Override 
    public boolean isValid(final MyBean value, 
      final ConstraintValidatorContext context) { 

     boolean isValid = true; 
     //your validation here 

     return isValid; 
    } 
} 
+0

ありがとう、これは魅力的に機能しました! – user871611

3

Spring Frameworkを使用している場合は、Spring Expression Language(SpEL)を使用できます。私は、クロスフィールド検証を非常に簡単にするSpELに基づいたJSR-303バリデーターを提供する小さなライブラリを書いています。 https://github.com/jirutka/validator-springをご覧ください。

そして例では、あなたのケースのためにあります:

@SpELAssert(value = "someString != null", applyIf = "selected", 
      message = "{validator.missing_some_string}") 
public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

は、実は、これはあまりにも簡単でした。より興味深いものを試してください。パスワードフィールドの1つがnullでない場合は、パスワードフィールドの平等性を試してみてください。

@SpELAssert(value = "password.equals(passwordVerify)", 
      applyIf = "password || passwordVerify", 
      message = "{validator.passwords_not_same}") 
public class User { 

    private String password; 
    private String passwordVerify; 
} 

そしてあなたも、これらの式では、独自の「ヘルパーメソッド」を使用することができます!

Hibernate Validatorの@ScriptAssertアノテーションと比較して、これは純粋なJavaソリューションです.JSR-223に準拠したスクリプト言語を使用していないため、少し問題があります。反対に、このソリューションはSpringベースのアプリケーションでのみ面白いです。

+0

美しい、とても素敵な仕事Jakubです。 –

関連する問題