2014-10-13 15 views
7

bir dize uzunluğunu doğrulamak için. javax.validation: Kısıtlama Bazı fasulye alanlar değerlerini doğrulamak <code>javax.validation</code> kullanıyorum bayt

Bu

Normalde ne kullanın:

public class Market { 

    @NotNull 
    @Size(max=4) 
    private String marketCode; 

    @Digits(integer=4, fraction=0) 
    private Integer stalls; 

    // getters/setters 
} 

Bu, her Market örneği 4 karakter maksimum uzunluğu olan bir pazar kodunu ve 4 tamsayı basamak maksimum durak bir dizi olduğundan emin olun ve 0 ondalık basamak.

Şimdi, DB/den/mağaza verilerini yüklemek için bu fasulye kullanın. Gördüğünüz gibi

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

, ben MARKET_CODE en fazla 4 bayt uzunluğunda olabilir: DB ise

Böyle tanımlanan tablo Markets var. @Size ek açıklaması, dizenin en fazla 4 karakter uzunluğunda olup olmadığını kontrol eder, bu da yanlıştır.

Soru şu: string bayt karakterler yerine kontrol edecektir @Size gibi bir açıklama var mı?

+1

4 bayt? Muhtemelen "string" i kontrol eden kendi doğrulayıcıya ihtiyaç duyacaksınız .getBytes (Charsets.UTF_8) .length' – ptomli

+0

MarketCode'daki karakterlerin her biri bir bayta sığması garanti ediliyor mu? – Simon

+0

@ptomli "WE8MSWIN1252" gibi görünüyorlar. Sorun şu ki, test ortamında olduğum için, üretim ortamındaki DB'nin aynı şifrelemeye sahip olup olmadığını bilmiyorum ... – BackSlash

cevap

5

kontrol Hibernate Validator documentation on Creating custom constraints.

Onaylayıcınız, bazı varsayılan veya belirtilen Charset kullanarak String kodunu byte[] kodlamalıdır. UTF-8'i iyi kullanabileceğini hayal ediyorum. bağlı hazırda belgelerinde tarif edilen gibi uygun bir ek açıklaması sabit kodlanmış UTF-8 kodlama kullanır ve kabul böyle

Belki bir şey. Ne kodlamada

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; 
    } 
} 
İlgili konular