我正在使用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
这样的注释会检查字符串字节而不是字符?
答案 0 :(得分:7)
检查Hibernate Validator documentation on Creating custom constraints。
您的验证者需要使用默认值String
将byte[]
编码为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;
}
}