Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.validation:验证字符串长度(字节)的约束_Java_String_Validation_Byte_Constraints - Fatal编程技术网

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则您的问题未指定。字符不是字节,在不知道应用程序将如何将字符转换为字节(称为编码)的情况下,您无法确定任何给定字符串将占用多少字节。或者,您的应用程序将指定哪种编码作为自定义批注的一部分,或者您的应用程序规范文档将使用什么。您需要知道编码才能指定字节数,这是您在静态代码中尝试执行的。此难题缺少一些部分