2013-12-18 81 views
0

我有一個類級驗證,像這樣:如何將類級別驗證映射到特定字段?

@PostalCodeValidForCountry 
public class Address 
{ 
    ... 
    private String postalCode; 
    private String country; 
} 

驗證實現像這樣:

@Override 
public boolean isValid(Address address, ConstraintValidatorContext constraintContext) 
{ 
    String postalCode = address.getPostalCode(); 
    String country = address.getCountry(); 
    String regex = null; 
    if (null == country || Address.COUNTRY_USA.equals(country)) 
    { 
     regex = "^[0-9]{5}$"; 
    } 
    else if (Address.COUNTRY_CANADA.equals(country)) 
    { 
     regex = "^[A-Za-z][0-9][A-Za-z] [0-9][A-Za-z][0-9]$"; 
    } 

    Pattern postalPattern = Pattern.compile(regex); 
    Matcher matcher = postalPattern.matcher(postalCode); 
    if (matcher.matches()) 
    { 
     return true; 
    } 

    return false; 
} 

目前,當我得到的BindingResult從失敗的驗證結果的誤差是ObjectError上與地址的objectName。但是,我想將此錯誤映射到postalCode字段。因此,我不想報告一個ObjectError,而是想報告一個FieldError,其中包含一個postalCode的fieldName。

是否有可能在自定義驗證本身內做到這一點?

回答

1

我希望你正在尋找的是這樣的:

constraintContext.buildConstraintViolationWithTemplate("custom_error_code").addNode("postalCode").addConstraintViolation(); 

這是修改後的方法將如何看起來像:

@Override 
public boolean isValid(Address address, ConstraintValidatorContext constraintContext) 
{ 
    String postalCode = address.getPostalCode(); 
    String country = address.getCountry(); 
    String regex = null; 
    if (null == country || Address.COUNTRY_USA.equals(country)) 
    { 
     regex = "^[0-9]{5}$"; 
    } 
    else if (Address.COUNTRY_CANADA.equals(country)) 
    { 
     regex = "^[A-Za-z][0-9][A-Za-z] [0-9][A-Za-z][0-9]$"; 
    } 

    Pattern postalPattern = Pattern.compile(regex); 
    Matcher matcher = postalPattern.matcher(postalCode); 
    if (matcher.matches()) 
    { 
    return true; 
    } 

    // this will generate a field error for "postalCode" field. 
    constraintContext.disableDefaultConstraintViolation(); 
    constraintContext.buildConstraintViolationWithTemplate("custom_error_code").addNode("postalCode").addConstraintViolation(); 

    return false; 
} 

記住,你會看到這個FieldError只BindingResult對象如果你的「isValid」方法將返回false。

+0

這看起來很有希望,最初的問題隨着我們設計的變化而消失:我們現在有一個DTO對象,我們進行驗證,允許我們在更具體/粒度級別而不是在較低庫中指定驗證本身。我將此標記爲答案,因爲這是我正在尋找的答案類型。 – Noremac

相關問題