2012-03-14 9 views
0

JSR-303では、検証中に値を変更する方法はありますか?JSR-303 Bean検証有効期間中に値を変更する

public class MyEntity { 

    public String getName() { 
     return name; 
    } 

    // is it true that JSF/JAXB/JPA will always use this setter method? 
    public void setName(final String name) { 
     if (name == null) { 
      throw new NullPointerException("null name"); 
     } 
     final String collapsed = new CollapsedStringAdapter().unmarshal(name); 
     if (collapsed.length() < NAME_SIZE_MIN) { 
      throw new IllegalArgumentException("too short"); 
     } 
     if (collapsed.length() > NAME_SIZE_MAX) { 
      throw new IllegalArgumentException("too long"); 
     } 
     this.name = collapsed; 
    } 

    @NotNull 
    @Size(min = 1, max = 40) 
    @CollapsedStringSize(min = 1, max = 40) // xs:token 
    private String name; 

    @NotNull 
    @Size(min = 0, max = 255) 
    @NormalizedStringSize(min = 0, max = 255) // xs:normalizedString 
    private String description; 
} 

私はカスタム検証何かをするつもりだと言うが、

@Constraint(validatedBy = CollapsedStringSizeValidator.class) 
public @interface CollapsedStringSize { 
    int min() default 0; 
    int max() default Integer.MAX_VALUE; 
} 

public class CollapsedStringSizeValidator 
    implements ConstraintValidator<CollapsedStringSize, String> { 

    @Override 
    public boolean isValid(String object, 
          ConstraintValidatorContext constraintContext) { 

     if (object == null) { 
      return true; 
     } 

     final String collapsed = new CollapsedStringAdapter().unmarshal(object); 

     // how can I get the min/mix anyway? 

     return collapsed.length() >= min && collapsed.length() <= max; 
    } 
} 

ように見えるバリデータの検証/検証の前または間、値を変更する方法はありますか?
私はセッターで立ち往生しなければなりませんか?あなたの例では

+0

エンジンの検証中に値を変更したいのはなぜですか?あなたの事件についての詳細な情報を記述できますか? –

+0

実際に私の元来の心配は、XMLにマーシャリングする前またはDBに保存する前に、値を有効なフォーム(折りたたみ/正規化)として保持していることです。 –

+1

あなたが入力データの "有効な形式"を自動的に把握できるのであれば、データがデータベースに保存される前に、setterを使用することができます。検証フレームワークの主な用途は、ビジネスロジックのコードを複雑にすることなく、自動的に修正することができないデータを検証することです。さらに、検証フレームワークを使用すると、検証可能なロジックを検証可能なユニットに書き込むことができます。 –

答えて

1

は、setName()は次のようになります。修正上記のよう

public void setName(final String name) { 
    if (name == null) { 
     this.name = null; 
     return; 
    } 
    this.name = new CollapsedStringAdapter().unmarshal(name); 
} 

を、あなたはもう@CollapsedStringSizeを使用する必要はありません。 @Sizeは、検証には十分です。

JPAでは、JPAエンジンがエンティティオブジェクトにデータをロードした後にデータを処理する場合は、@PostLoadを試すことができます。

+0

あなたはそうです。 '@ NotNull'もあるので、' null'チェックも必要ありません。 JPA/JSFが、リフレクションや既存のセッターメソッドのない何かによって、DB/Faceletからフィールドに直接値を設定できるのは本当ですか?私はセッター以外に '@ PostLoad'を考慮する必要がありますか? –

+0

私はJSFに精通していません。 JPAについては、[この質問](http://stackoverflow.com/questions/3976469/is-hibernate-jpa-taking-in-consideration-the-transiant-modifier-not-the-anno)を参照してください。 –

関連する問題