2011-06-10 74 views
8

可能重複:
using Hibernate Validator without calling annotation.編程Bean驗證(JSR 303)無註釋

我有(僅用於說明)這種複合約束註釋:

@Target... @Retention... 
@Constraint(validatedBy = {}) 
@Pattern(regexp = PasswordComplexity.AT_LEAST_TWO_NONE_ALPAH_CHARS) 
@Length(min = 6, max = 20) 
public @interface PasswordComplexity { 
    ...  
} 

而且我在Spring控制器和實體類中使用它。

但現在我需要檢查一個服務方法中的單個字符串,我需要將相同的約束應用於單個字符串。由於約束條件相同,我想使用約束的相同定義(@PasswordComplexity)(單一來源)。喜歡的東西:

public void createUser(UserDto userDto, String password) { 
    if(hasViolation(validator.validate(password,PasswordComplexity.class))) { 
    throw new PasswordComplexityViolationException(); 
    } else { 
    … 
    } 
} 

但我不知道該怎麼辦好了JSR 303驗證一個沒有註釋的簡單對象(字符串)。至少有可能,以及如何?

(我使用Hibernate驗證作爲JSR 303提供)

+0

我明白'單一來源的真相',你的意思是不必重複你的註釋,它可能放在'UserDto'類的'password'屬性/字段中,對吧?但在你的「類似」例子中,你至少要重複註釋的名稱('PasswordComplexity')。這不是冗餘嗎? – 2011-06-10 09:08:38

+0

@Grzegorz Oledzki:沒問題的是不要在不同的地方使用註釋。對於「單一真相源」,我的意思是我想使用註釋,而不是在別處寫同樣的東西(長度和模式)定義。 – Ralph 2011-06-10 09:56:35

+0

@abalogh:問題是重複的(我把它覆蓋了),但接受的答案與問題不符 - 或者至少不是我的問題。 – Ralph 2011-06-10 10:10:19

回答

2

一種方式做,這將是寫一個完整的自定義驗證,並且向下推動邏輯成類具有註釋只使用驗證。這意味着你有獨立的編譯單元(完整的類PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...),你可以獨立使用註釋。這種方法還可以使您更容易地單元測試驗證。

但是,由於您使用註釋作爲配置由Hibernate提供的現有正則表達式驗證程序的一種方式,因此您可以使用該註釋,從註釋類傳遞常量模式。你也應該能夠將你的長度約束打包到正則表達式中,這比起兩種註釋都更簡單快捷。