編寫自定義Hibernate Validator是一個不錯的選擇。如果您選擇使用它,請將hibernate-validator
JAR放在您的類路徑中。我在本例中使用了最新版本5.1.1.Final。
有很多的代碼必須被顯示爲它工作,但它確實三個部分:
- 在球場上的批註指定,這是一個需要,
要驗證的元素
- 註釋本身的標準實現,以及
- 該註釋和對象類型的
ConstraintValidator
的實現。
首先,豆:
public class Length {
@ValidUnit // this is the annotation we will use to validate.
private String inputUnit;
public String getInputUnit() {
return inputUnit;
}
public void setInputUnit(final String inputUnit) {
this.inputUnit = inputUnit;
}
}
字段爲String
;我們需要記住,以備後用。
接下來是註釋。 Hibernate要求存在message()
,groups()
和payload()
。我相信JSR-303只需要這個信息。所以,我們會繼續實施,只實施我們認爲我們需要的幾件事情。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = ValidUnitValidator.class)
public @interface ValidUnit {
String message() default "Not a supported unit.";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
的@Constraint
註釋這個類以上告訴Hibernate使用該類型的驗證哪個類。所以,我們來實現它。
任何實施ConstraintValidator
的聲明都是註釋和T
類型。我們正在嘗試驗證String
,因此我們在實施中將其替換爲T
。
public class ValidUnitValidator implements ConstraintValidator<ValidUnit, String> {
private final Set<String> validUnits = new HashSet<>(Arrays.asList("inches", "feet", "meters", "millimeters"));
@Override
public void initialize(final ValidUnit validUnit) {
}
@Override
public boolean isValid(final String value, final ConstraintValidatorContext constraintValidatorContext) {
return validUnits.contains(value);
}
}
最終,與直接驗證內聯的方法相比,它有點禮儀。但是,這可以讓你更好地區分顧慮;如果你想改變什麼是有效的單位(你可能想要添加光年),你只需要修改和測試一個類。
'ALLOWABLE_UNITS.contains(lengthUnit)' –