javax.validation:验证字符串长度(字节)的约束
我正在使用javax.validation:验证字符串长度(字节)的约束,java,string,validation,byte,constraints,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个字符的市场代
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中,我将表市场定义如下:
CREATE TABLE MARKETS (
MARKET_CODE VARCHAR2(4 BYTE) NOT NULL,
STALLS NUMBER(4,0)
)
如您所见,我有MARKET\u code
,最长可达4字节。@Size
注释将检查字符串长度是否最多为4个字符,这是错误的
因此,问题是:是否有类似于@Size
的注释来检查字符串字节而不是字符?检查字符串
验证器需要使用一些默认或指定的字符集将字符串
编码为字节[]
。我想你可能会使用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;
}
}
公共类MaxByTelengValidator实现ConstraintValidator{
私人int max;
公共void初始化(MaxByTeletLength ConstraintAnotation){
this.max=constraintanotation.value();
}
公共布尔值有效(字符串对象、ConstraintValidatorContext constraintContext){
return object==null | | object.getBytes(Charsets.UTF_8)。以何种编码长度为4字节?您可能需要自己的验证器来有效地检查“string”.getBytes(Charsets.UTF_8).length
是否保证marketCode中的字符每个只能容纳一个字节?@ptomli它们似乎是WE8MSWIN1252
。问题是我在一个测试环境中,我不知道生产环境中的DB是否具有相同的编码…@Simon否。如果有保证,我就不会搜索一个t检查字节:)@backslax则您的问题未指定。字符不是字节,在不知道应用程序将如何将字符转换为字节(称为编码)的情况下,您无法确定任何给定字符串将占用多少字节。或者,您的应用程序将指定哪种编码作为自定义批注的一部分,或者您的应用程序规范文档将使用什么。您需要知道编码才能指定字节数,这是您在静态代码中尝试执行的。此难题缺少一些部分