javax.validation:以字节为单位验证字符串长度的约束

时间:2014-10-13 09:45:12

标签: java string validation byte constraints

我正在使用javax.validation来验证某些bean字段的值。

这是我正常使用的:

public class Market {

    @NotNull
    @Size(max=4)
    private String marketCode;

    @Digits(integer=4, fraction=0)
    private Integer stalls;

    // getters/setters
}

这将确保每个Market实例都有一个最大长度为4个字符的市场代码和一个最多包含4个整数位和0位小数的停顿数。

现在,我使用此bean从/向DB加载/存储数据。

在DB中我有Markets表定义如下:

CREATE TABLE MARKETS (
    MARKET_CODE VARCHAR2(4 BYTE) NOT NULL,
    STALLS NUMBER(4,0)
)

如您所见,我有MARKET_CODE,最长可达4 个字节@Size注释将检查字符串是否最多为4个字符,这是错误的。

所以,问题是:是否有像@Size这样的注释会检查字符串字节而不是字符?

1 个答案:

答案 0 :(得分:7)

检查Hibernate Validator documentation on Creating custom constraints

您的验证者需要使用默认值Stringbyte[]编码为Charset。我想你可能会使用UTF-8。

也许这样的东西,它使用硬编码的UTF-8编码并假设一个合适的注释,如链接的Hibernate文档中所述。

public class MaxByteLengthValidator implements ConstraintValidator<MaxByteLength, String> {
    private int max;
    public void initialize(MaxByteLength constraintAnnotation) {
        this.max = constraintAnnotation.value();
    }
    public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
        return object == null || object.getBytes(Charsets.UTF_8).length <= this.max;
    }
}