2014-10-13 9 views
7

Ich verwende javax.validation, um einige Werte von Bean-Feldern zu validieren.javax.validation: Einschränkung, um eine Stringlänge in Bytes zu validieren

Dies ist, was ich normalerweise:

public class Market { 

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

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

    // getters/setters 
} 

Dies wird sicherstellen, dass jede Market Instanz einen Markt Code mit einer maximalen Länge von 4 Zeichen und eine Reihe von Stall mit maximal 4 Vorkommastellen hat und 0 Dezimalziffern.

Jetzt verwende ich diese Bean zum Laden/Speichern von Daten von/zu DB.

Im DB Ich habe Tabelle Markets wie folgt definiert:

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

Wie Sie sehen können, habe ich MARKET_CODE, die höchstens 4 Bytes lang sein kann. Die @Size Annotation überprüft, ob die Zeichenfolge maximal 4 Zeichen lang ist, was falsch ist.

Die Frage ist also: Gibt es eine Annotation wie @Size, die für die Zeichenfolge Bytes anstelle der Zeichen überprüfen?

+1

4 Bytes in welcher Codierung? Sie werden wahrscheinlich Ihren eigenen Validator brauchen, der '' string '' effektiv prüft .getBytes (Charsets.UTF_8) .length' – ptomli

+0

Sind die Zeichen im marketCode garantiert in ein Byte zu passen? – Simon

+0

@ptomli Sie scheinen "WE8MSWIN1252" zu sein. Das Problem ist, dass ich in einer Testumgebung bin, ich weiß nicht, ob die DB in der Produktionsumgebung die gleiche Codierung haben wird ... – BackSlash

Antwort

5

Überprüfen Sie die Hibernate Validator documentation on Creating custom constraints.

Ihr Validator muss die String in eine byte[] codieren, wobei einige Standardwerte oder Charset verwendet werden. Ich kann mir vorstellen, dass Sie UTF-8 gut gebrauchen könnten.

Vielleicht etwas wie dieses, das eine hart codierte UTF-8-Codierung verwendet und eine passende Anmerkung annimmt, wie in der Hibernate-Dokumentation beschrieben.

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; 
    } 
} 
Verwandte Themen