2011-08-17 124 views
0

JSR-303 bean驗證是否可以編寫可與後端服務交談的自定義註釋?使用Spring和iBatis JSR-303 bean驗證

我們用「老派」Spring驗證器完成了這種類型的驗證。在這種情況下,驗證器是一個Spring bean,並且可以注入其他服務。然後該驗證程序被注入到控制器中。

一個示例可能是一個註釋(也許@EmailExists)來驗證電子郵件是否已經存在。我只能通過使用我們的服務之一的SQL查詢來做到這一點。我寧願將其與其他註釋一起「驗證」,並儘快進行檢查,而不必在後端服務中明確地進行檢查。

注意:我們正在使用iBATIS/MyBatis的,所以我不能使用任何JPA/Hibernate的技巧:-)

的感謝!

回答

0

這絕對有可能。 Spring也在約束驗證器中提供dependency injection support。所以,你可以簡單地注入任何所需的服務在您的自定義驗證這樣的:

public class EmailExistsValidator implements ConstraintValidator<EmailExists, String> { 

    @Inject 
    private EmailValidationService service; 

    @Override 
    public void initialize(EmailExists constraintAnnotation) {} 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 

     if (value == null) { 
      return true; 
     } 

     return service.exists(value); 
    } 
} 

根據您的具體情況這可能是一個好主意,先檢查「廉價」的約束,比如@NotNull且僅當這些約束是有效的檢查更昂貴的限制,如@EmailExists

您可以在group sequences的幫助下爲此類型重新定義default group sequence

+0

我沒有想到@Inject。我們會嘗試。非常感謝! – mrjabba