2013-02-12 31 views
1

如何使用JSR-303驗證方法參數並在參數無效時拋出異常?JSR 303.驗證方法參數並拋出異常

例如這樣的:public void createUser(@ValidOrThrowException User user) {...}

現在,我檢查每個方法參數的方法體,像

public void createUser(User user) { 
    ConstraintViolations violations = Validator.validate(user); 
    if (!violations.isEmpty()) { 
     throw new IllegalArgumentException(createExceptionMessage(violations)); 
    } 
    ...//business logic 
} 

,我認爲這是醜陋的。

P.S.作爲參考實現,我使用Hibernate驗證程序4.1.0.Final

回答

2

如果您可以升級到Hibernate Validator 4.2.0或更高版本,那麼可以使用它的method validation feature,它爲驗證方法參數和返回值提供支持。

使用諸如動態代理,AOP,攔截器等手段調用約束方法時,可以自動調用驗證引擎。根據您使用的框架,您可以例如使用下列之一:

注意,作爲Bean Validation 1.1(即將完成)和它的參考實現Hibernate驗證5加入example for this,方法驗證將標準化Bean驗證API的一部分。

+0

謝謝。所以它意味着用@ Valid語句註釋的參數本身不會拋出異常,如果對象是無效的?我需要手動創建一個方面(AOP),'@pointcut'指向方法參數中的所有'@ Valid'註解?當發現這樣的註釋時,我需要創建'Validator'實例並手動驗證用'@ Valid'註釋的方法參數值? – MyTitle 2013-02-12 11:47:51

+0

難道你沒有AspectJ的例子嗎? – MyTitle 2013-02-12 11:51:37

+0

我不幸沒有使用AspectJ的例子。但是一般方法應該與GitHub上的示例項目相同:攔截調用,驗證參數,繼續調用,驗證返回值,如果任一驗證步驟失敗,則拋出'ConstraintViolationException'。 – Gunnar 2013-02-12 14:34:02