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;
}
}
ように見えるバリデータの検証/検証の前または間、値を変更する方法はありますか?
私はセッターで立ち往生しなければなりませんか?あなたの例では
エンジンの検証中に値を変更したいのはなぜですか?あなたの事件についての詳細な情報を記述できますか? –
実際に私の元来の心配は、XMLにマーシャリングする前またはDBに保存する前に、値を有効なフォーム(折りたたみ/正規化)として保持していることです。 –
あなたが入力データの "有効な形式"を自動的に把握できるのであれば、データがデータベースに保存される前に、setterを使用することができます。検証フレームワークの主な用途は、ビジネスロジックのコードを複雑にすることなく、自動的に修正することができないデータを検証することです。さらに、検証フレームワークを使用すると、検証可能なロジックを検証可能なユニットに書き込むことができます。 –