2014-10-13 13 views
7

Używam sprawdzania wartości pól fasoli za pomocą javax.validation.javax.validation: Wiązanie do sprawdzania długości ciągu w bajtach

To właśnie używam normalnie:

public class Market { 

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

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

    // getters/setters 
} 

To będzie upewnić się, że każdy Market instancja ma kod rynkową o maksymalnej długości 4 znaków oraz liczbę stoisku z maksymalnie 4 cyfr całkowitych i 0 cyfr dziesiętnych.

Teraz używam tego komponentu do załadowania/zapisania danych z/do DB.

W DB Mam tabelę Markets zdefiniowany następująco:

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

Jak widać, mam MARKET_CODE które mogą być co najwyżej 4 bajtów długo. Adnotacja @Size sprawdzi, czy ciąg znaków ma co najwyżej 4 znaków o długości, co jest błędne.

Pytanie brzmi: czy istnieje adnotacja podobna do @Size, która sprawdza bajty napisów zamiast znaków?

+1

4 bajty w jakim kodowaniu? Prawdopodobnie będziesz potrzebować własnego sprawdzania poprawności, który sprawdzi "ciąg" znaków .getBytes (Charsets.UTF_8). Length' – ptomli

+0

Czy znaki w klasie MarketCode są dopasowane do jednego bajtu? – Simon

+0

@ptomli Wydają się być 'WE8MSWIN1252'. Problem polega na tym, że jestem w środowisku testowym, nie wiem, czy DB w środowisku produkcyjnym będzie miał takie samo kodowanie ... – BackSlash

Odpowiedz

5

Sprawdź numer Hibernate Validator documentation on Creating custom constraints.

Twój weryfikator będzie musiał zakodować String w byte[], używając domyślnego lub określonego Charset. Wyobrażam sobie, że możesz używać UTF-8.

Może coś w tym stylu, które używa zakodowanego kodowania UTF-8 i przyjmuje odpowiednią adnotację, zgodnie z dołączoną dokumentacją 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; 
    } 
} 
Powiązane problemy