2015-07-10 16 views
0

我希望有人能夠幫助我理解Spring的Bean驗證。首先,如果我有一個註解類,瞭解Spring's Bean驗證

@Entity 
public class User { 
    @NotNull 
    @Column(name = "USERNAME", unique = true, nullable = false) 
    private String username; 

    public String getUsername() 
    { 
     return username; 
    } 

    public void setUsername(String username) 
    { 
     this.username = username; 
    } 
} 

我仍然可以構造一個對象new User();這將是無效的。我的問題是,何時/何地/如何進行驗證?這是正確的,還是我做錯了什麼?我想我應該要求在構造函數中設置任何非空字段,但是如果這是實施的方法,那麼還提供註釋的目的是什麼?

回答

1

您可以創建一個新的User對象,即使它是在創建時無效,因爲不調用驗證。您必須手動或使用Spring設施進行驗證來調用給定bean上的bean驗證。例如考慮這種用法在Spring控制器:

@RequestMapping(method=POST) 
public void save(@RequestBody @Valid User user) { 
} 

在這種情況下,Spring將調用驗證的POST請求該處理方法,如果驗證失敗,將返回HTTP 400。在內部,這由RequestResponseBodyMethodProcessor負責。

你也可以手動調用給定對象的驗證,像這樣:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 
Set<ConstraintViolation<User>> errors = validator.validate(user); 

並回答你的問題,你可以強制非空值在構造函數中設置。但是讓我們來看一下第一個帶控制器的例子。它不會使用該構造函數,它將使用默認的構造函數來創建空的User對象,然後將請求值映射到其屬性,以便這種強制執行方法在此處不起作用。

而且,通常你可能想在無效狀態的對象之前,它是完全初始化和驗證它,你用它做的東西,實際上是希望對象是有效的了。

+0

這很有道理。所以,Spring將在Controller中和persist()上驗證 - 是否有另一種時間/方法來驗證驗證?我嘗試在DAO保存方法中放入'@ Valid',但沒有觸發驗證。 –

+0

在做更多的閱讀時,它看起來像Spring只會驗證控制器。我需要實現一個自定義註釋以使服務按照我喜歡的方式行事。 –