至少有两种方法可以解决这个问题。
一个更简单的解决方案将是为此属性创建自己的 getter 方法并将注释移动到 getter 级别,而不是将它们保留在字段上。这样,您就可以为 getter 返回的内容添加一些逻辑:
public class PojoWithGetter {
private String position;
//....
@DecimalMin("-10")
@DecimalMax("10")
public String getPosition() {
return "".equals( this.position ) ? null : this.position;
}
}
这样做将允许您通过进行相对较小的更改来利用与 Hibernate Validator 捆绑的默认验证器的使用。
或者,您可以提供自己的DecimalMin/DecimalMax 验证器实现。这可以通过XML(参见本节末尾的示例“使用XML 为@URL 注册基于正则表达式的约束定义”)或programmatically 来完成。这是您如何使用代码执行此操作的示例:
HibernateValidatorConfiguration configuration = Validation
.byProvider( HibernateValidator.class )
.configure();
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
constraintMapping
.constraintDefinition( DecimalMax.class )
// NOTE: you are excluding default validators. So you'd need to add any
// others for different types that you need explicitly.
.includeExistingValidators( false )
.validatedBy( CustomDecimalMaxCharSequenceValidator.class );
// same for DecimalMin and any others ...
configuration.addMapping( constraintMapping );
Validator validator = configuration.buildValidatorFactory().getValidator();
// ...
您的自定义验证器可能类似于:
public class CustomDecimalMaxCharSequenceValidator extends DecimalMaxValidatorForCharSequence {
@Override
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
if ( "".equals( charSequence ) ) {
return true;
}
return super.isValid( charSequence, constraintValidatorContext );
}
}
但这要麻烦得多,并且删除了您必须使用相同方法添加回来的默认验证器。