2010-12-12 65 views
10

JSR-303是否也用於方法參數驗證?使用JSR-303進行方法參數驗證

如果是這樣,網絡上是否有任何示例?我面臨的最大挑戰是如何在每種方法中獲得驗證器。對於Spring 3,這是不是意味着我不得不爲每個課程注入LocalValidatorFactoryBean

謝謝!

回答

3

這聽起來像AOP(AspectJ)的用例。編寫用javax.validation.constraints.*註釋的方法的切入點,向方面注入驗證程序(可能使用Spring),並使用@Before@Around建議在方法執行之前執行驗證。

閱讀AspectJ in Action僅供參考。

3

javadocs每個JSR 303註解的講述如下:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

見,PARAMETER是存在的。所以,是的,這是技術上可能。

下面是一個例子:

public void method(@NotNull String parameter) { 
    // ... 
} 

我但是不知道如何與Spring集成,因爲我不使用它。你可以試試看。

9

即將推出的JSR 303參考實現Hibernate Validator 4.2版本將支持方法級別驗證。

正如在前面的答案中指出的那樣,這將允許在方法參數和返回值中指定約束註釋(內置以及自定義類型)以指定方法調用的前置條件和後置條件。

請注意,HV只會處理方法調用的實際驗證,而不會觸發此驗證。可以使用AOP或其他方法攔截工具(如JDK的動態代理)來完成驗證調用。

JIRA的問題是HV-347 [1],因此您可能希望將自己添加爲此問題的觀察者。

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

我覺得你的博客文章補充你的答案;)http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ühttp.html – Maxym 2011-01-27 15:34:13

+0

Gunnar很好,可以將他的解決方案放入[GitHub](https://github.com/gunnarmorling/methodvalidation-integration)。爲我工作很好。 – Patrick 2011-10-13 21:24:19

0

您可以使用jcabi-aspects(我是一個開發者),其JSR 303 AspectJ的集成。實際驗證由JSR 303實現之一來完成,您必須將其添加到類路徑中,如Hibernate Validator或Apache BVal。

2

在Spring 3.1.0中,您可以使用@Validated註釋來激活對pojo的驗證。 爲pojo類創建一個接口並將其添加到該接口上,然後在方法定義中添加驗證註釋。(該接口是必需的,因爲Spring將創建一個使用界面定義的代理類)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

您的POJO:

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

從主動驗證標準彈簧Web應用程序開始,記得要加在Spring配置這個bean聲明:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

對於一些奇怪的原因ConstraintViolationException public \ @NotNull String doSomething();沒有工作,但\\NotNull public String doSomething();沒有。使用該欄來逃避與S.O用戶混淆的At符號 – borjab 2016-04-18 15:10:02