【问题标题】:Java Bean Validation using @DecimalMin @DecimalMax but also allow empty string?Java Bean Validation 使用@DecimalMin @DecimalMax 但也允许空字符串?
【发布时间】:2022-09-28 17:34:53
【问题描述】:

我遇到了一个奇怪的案例,给出了以下模型类:

@DecimalMin(\"-10\")
@DecimalMax(\"10\")
String position;

并且客户端有一个请求,将position 设置为空字符串\"\",并期望验证通过。这是我无法谈判的事情,那么有什么办法可以解决这种情况吗?就像是:

@DecimalMin(\"-10\")
@DecimalMax(\"10\")
@Empty
String position;
  • 为什么使用字符串类型?

标签: java hibernate-validator javax-validation


【解决方案1】:

至少有两种方法可以解决这个问题。

一个更简单的解决方案将是为此属性创建自己的 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 );
    }
}

但这要麻烦得多,并且删除了您必须使用相同方法添加回来的默认验证器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多