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

Bac*_*ash 8 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
}
Run Code Online (Sandbox Code Playgroud)

这将确保每个Market实例都具有最大4字符长度的市场代码和最多4个整数位和0个十进制数的停顿数.

现在,我使用这个bean从/向DB加载/存储数据.

在DB我有这样Markets定义的表:

CREATE TABLE MARKETS (
    MARKET_CODE VARCHAR2(4 BYTE) NOT NULL,
    STALLS NUMBER(4,0)
)
Run Code Online (Sandbox Code Playgroud)

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

所以,问题是:是否有一个注释@Size,将检查字符串字节而不是字符?

pto*_*mli 7

查看有关创建自定义约束Hibernate Validator文档.

您的验证器需要使用某些默认值或指定编码String为a .我想你可能会使用UTF-8.byte[]Charset

也许是这样的,它使用硬编码的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;
    }
}
Run Code Online (Sandbox Code Playgroud)