我有一个简单的豆子enum
field
public class TestBean{
@Pattern(regexp = "A|B") //does not work
private TestEnum testField;
//getters + setters
}
enum TestEnum{
A, B, C, D
}
我想验证testField
使用 Bean 验证。具体来说,我想确保只允许 A 和 B 值(对于特定的校准组)。看来枚举没有被处理 JSR 303 (我试图使用 @Pattern 验证器)或者我正在以错误的方式做某事。
我遇到异常:
javax.validation.UnexpectedTypeException: No validator could be found for type: packagename.TestEnum
有没有办法在不编写自定义验证器的情况下验证枚举字段?
由于某些原因不支持枚举,因此可以通过简单的基于字符串的验证器来简单地处理此限制。
验证器:
/**
* 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
{};
}
验证器使用 apache commons 库。先进的强制类型方法将进一步增强该验证器的灵活性。
另一种方法可以使用单个字符串属性而不是数组并按分隔符分割。这也可以很好地打印错误消息的值,因为不会打印数组,但是使用以下方法处理空值可能会出现问题String.valueOf(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)