2012-03-21 10 views
0

JSR-303 Beanの検証を開始したところで、何かが可能かどうか疑問に思っていました。私たちはすべての文字列フィールドのためのアプリケーションでデフォルトの正規表現を持っています。これをBeanの検証を使用して適用したい場合は、フォームオブジェクト内の各フィールドに注釈を付ける必要があると思います。JSR-303 Bean検証で複数のフィールドに注釈を付ける

@Pattern(regexp = REG_EXP) 
private String aString; 

@Pattern(regexp = REG_EXP) 
private String anotherString; 

@Patternを1回のヒットですべての文字列(または特定のフィールド)に適用できますか?我々はJSF2.0をフロントエンドとしてWeblogic 10.3.4でHibernate実装を使用しています。私がWebサービスから来ている可能性があるので、検証はビューから独立しているべきです。

答えて

2

複数のフィールドを一度に検証するには、タイプレベルでアノテーションを使用し、REGEXPを使用してすべてのStringフィールドをチェックするカスタムValidatorを作成します。

編集:例を示します。これはReflectionを使用し、セキュリティに違反するため、これはかなり醜いですが、一般的な考えを与えるかもしれません。あなたが "オブジェクト"を使わずに具体的なクラスやインタフェースを使っていないなら、通常のgetterで成功する可能性があります。

テスト下のクラス(およびランナー)

import javax.validation.Validation; 
import javax.validation.Validator; 

import validation.AllStringsRegex; 

@AllStringsRegex(value="l") 
public class UnderValidation { 
    String a; 
    String b; 

    public static void main(String... args) { 
     UnderValidation object = new UnderValidation(); 
     object.a = "hello"; 
     object.b = "world"; 

     Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
     System.out.println(validator.validate(object)); 
    } 
} 

マイ注釈:

@Target({ TYPE, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = AllStringsRegexValidator.class) 
@Documented 
public @interface AllStringsRegex { 
    String message() default "String not regex"; 
    String value() default ""; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

マイバリ

public class AllStringsRegexValidator implements ConstraintValidator<AllStringsRegex, Object> { 
    private Pattern pattern = null; 

    @Override 
    public void initialize(AllStringsRegex annotation) { 
     pattern = Pattern.compile(annotation.value()); 
    } 

    @Override 
    public boolean isValid(Object object, ConstraintValidatorContext ctx) { 
     for (Field f : object.getClass().getDeclaredFields()) { 
      if (f.getType().equals(String.class)) { 
       try { 
        f.setAccessible(true); 
        String value = (String)f.get(object); 
        if (!pattern.matcher(value).find()) { 
         return false; 
        } 
       } 
       catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     return true; 
    } 
} 
+0

ありがとうございますが、@typeはJSFによって検証されません。しかし、カスタムバリデーターはどのようにすべてのStringフィールドをチェックしますか?上記の例の – andyfinch

+0

では、 "l"は "hello"と "world"の両方に一致するため、エラーはスローされません。 ConstraintViolationを取得するには "ll"に変更してください。 –

+0

ありがとう、非常に良い例と私はそれからいくつかの新しいものを学びました。 – andyfinch

0

私は使用しませんでしたが、grovvy、javascriptを使用してサーバーサイドでスクリプトをサポートしています。@ScriptAssert(lang = "javascript", script =_this.startDate.before(_this.endDate)スクリプトアノテーションは、休止状態の注釈です。

+0

おかげで、私はちょうど検証ニーズとして私の質問を編集しましたアクセス方法に関係なく、つまりWebサービスまたはブラウザを介して実行することができます。 – andyfinch

関連する問題