2011-02-04 35 views
8

我一直在尋找一段時間,沒有運氣。我使用Spring MVC的而不是,但仍想使用@javax.validation.Valid來啓用方法參數的驗證。舉個例子有沒有標準的方法來啓用JSR 303 Bean驗證使用帶註釋的方法參數

public class EventServiceImpl implements IEventService { 
    @Override 
    public void invite(@Valid Event event, @Valid User user) { ... } 
} 

使用MVC,這是@Controller註解的bean啓用了一個簡單的<mvc:annotation-driven/>(見5.7.4.3 Configuring a JSR-303 Validator for use by Spring MVC)。

使用AOP應該是相當簡單的。不過,我懷疑有一些標準的方法來做到這一點。因此,問題:對於非MVC應用程序和非控制器bean,是否有類似的事情來啓用註釋Bean的輸入驗證?

回答

6

方法級驗證不是Bean驗證規範(JSR 303)的一部分。方法級別驗證是在appendix C中添加的規範中的建議。

Hibernate Validator 4.2(beta已發佈)正在實現此建議,並允許將JSR 303註釋放置在方法參數和返回值上。當然,你仍然需要一些Spring膠水代碼,但這不應該太難。

此外,Bean Validation 1.1將正式添加方法級別驗證(不僅僅作爲附錄/推薦)。另見http://beanvalidation.org/

3

使用MVC,這是@Controller的豆

@Valid只是在控制器豆類標記隱藏,做了驗證,並把所有違反約束Errors在一個不錯的代碼啓用辦法。 Spring設計者可以發明自己的註解來做同樣的事情。

@Valid註釋的真正用途在於使用JSR 303驗證程序進行驗證的類(bean)中,它的主要用途是驗證對象圖。意思是一個bean可以有其他 帶有@Valid註解的bean引用來遞歸地觸發驗證。

在MVC之外,可以使用配置的驗證器來驗證任何使用JSR 303批註的Bean,但與控制器中良好填充的Errors不同,您將必須決定自己將如何處理約束違規。

所以,要回答你的問題,沒有標準的方法。爲了與控制器具有相同的外觀,您可以使用@Valid批註(或創建一個新批註)來運行AOP建議來驗證bean,並填充必須傳遞給一個「ViolationCollector」(類似於MVC中的錯誤)的'ViolationCollector'方法。