2014-10-22 24 views
4

我有一些模型類如何在服務層中結合JSR-303和Spring Validator類?

public class Account { 

    @Email 
    private String email; 

    @NotNull 
    private String rule; 
} 

和彈簧驗證

public class AccountValidator implements Validator { 

    @Override 
    public boolean supports(Class aClass) { 
     return Account.class.equals(aClass); 
    } 

    @Override 
    public void validate(Object obj, Errors errors) { 
     Account account = (Account) obj; 
     ValidationUtils.rejectIfEmpty(errors, "email", "email.required"); 
     ValidationUtils.rejectIfEmpty(errors, "rule", "rule.required"); 

     complexValidateRule(account.getRule(), errors); 
    } 

    private void complexValidateRule(String rule, Errors errors) { 
     // ... 
    } 
} 

我在服務運行

AccountValidator validator = new AccountValidator(); 
Errors errors = new BeanPropertyBindingResult(account, "account"); 
validator.validate(account, errors); 

我可以添加到我的驗證過程約束@Email,@NotNull (JSR-303),並沒有在AccountValidator中描述這些規則?

我知道如何在spring控制器中使用@Valid,但是服務層是怎麼回事?可能嗎?如何以適當的方式進行這種驗證?我應該使用Hibernate驗證器嗎?

回答

6

Spring提供了一個Adapter來合併兩個驗證API。 有關更多信息,請參閱當前的Spring JavaDoc

一個可能的實現是

public class AccountValidator implements Validator { 

    private final SpringValidatorAdapter validator; 

    public AccountValidator(SpringValidatorAdapter validator) { 
     super(); 
     this.validator = validator; 
    } 

    @Override 
    public boolean supports(Class aClass) { 
     return Account.class.equals(aClass); 
    } 

    @Override 
    public void validate(Object obj, Errors errors) { 

     //jsr303 
     validator.validate(obj, errors); 

     //custom rules 
     Account account = (Account) obj; 
     complexValidateRule(account.getRule(), errors); 
    } 

    private void complexValidateRule(String rule, Errors errors) { 
     // ... 
    } 
}