いくつかの理由で列挙がサポートされていないため、この制限は単純な文字列ベースのバリデーターで簡単に処理できます。
バリデーター:
/**
* Validates a given object's String representation to match one of the provided
* values.
*/
public class ValueValidator implements ConstraintValidator<Value, Object>
{
/**
* String array of possible enum values
*/
private String[] values;
@Override
public void initialize(final Value constraintAnnotation)
{
this.values = constraintAnnotation.values();
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context)
{
return ArrayUtils.contains(this.values, value == null ? null : value.toString());
}
}
インターフェース:
@Target(value =
{
ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER
})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy =
{
ValueValidator.class
})
@Documented
public @interface Value
{
public String message() default "{package.Value.message}";
Class<?>[] groups() default
{};
Class<? extends Payload>[] payload() default
{};
public String[] values() default
{};
}
ValidatorはApacheCommonsライブラリを使用します。高度な強制入力方式は、このバリデーターの柔軟性をさらに高めます。
別の方法として、配列の代わりに単一の文字列属性を使用し、区切り文字で分割することもできます。これは、配列が出力されないため、エラーメッセージの値も適切に出力しますが、null値の処理は次の場合に問題になる可能性があります。String.valueOf(...)