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

我正在使用 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加载/存储数据.

数据库我有表格市场定义如下:

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

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

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

解决方法

检查 Hibernate Validator documentation on Creating custom constraints.

您的验证器需要使用一些默认或指定的Charset将String编码为byte [].我想你可能会使用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;
    }
}

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...