2011-12-19 72 views
2

我希望對我自己的方法使用@NotNull註釋(或@Required或任何其他)。雖然這在Controller和Model類中工作得很好,但我不能讓它在我自己的工作中工作。這可能是更多的net.sf.oval問題,然後玩框架。但它可能是連接的,我不知道。使用net.sf.oval進行參數驗證(在播放框架中)

我有一個類,如:

@net.sf.oval.guard.Guarded 
public class SimulatorWrapper { 

    public SimulatorWrapper setRedCode(@play.data.validation.Required @net.sf.oval.constraint.NotNull final String redCode) { 
     // just gessing here: 
     if(Validation.hasErrors()) throw new RuntimeException("invalid argument"); 
     if(redCode == null) throw new RuntimeException("null"); 
     // do stuff 
     return this; 
    } 
} 

當我把這種方法用一個空參數,如果拋出我的異常,但@NotNull和@Required似乎做什麼都沒有。我究竟做錯了什麼? 玩框架項目隨橢圓1.5,我下載1.8並將其添加到Eclipse中的類路徑,以防萬一舊的有問題。

我用「play test my-server」啓動服務器,然後用我的瀏覽器導航到我的網站(不是測試,只是簡單的網站)。

謝謝,Alex

P.S.我知道「null是邪惡的」討論,但我沒有訪問其餘的代碼,所以我不能改變它。

回答

1

只有在調用控制器操作時,纔會調用驗證類來檢查Play框架的驗證註釋。

既然你在控制器不是,在驗證上的註釋不會被執行,所需annotion不會在Validation.hasErrors()

而不是使用註解,你可以使用類似的方法: Validation.required(redCode); //它會檢查爲空 然後,調用Validation.hasErrors(),它應該工作。

但是,我不認爲你應該這樣做,因爲來自Validation.hasError()的錯誤應該來自控制器動作調用的驗證,它可能會導致你的副作用。

如果您想要做類似於您的示例的事情,則不應該依賴播放驗證類。

您確定您在正確的地方使用驗證嗎?

+0

嗨,首先感謝您的答覆。當然,這是使用驗證的錯誤地方,但我正在處理的是真正愚蠢的代碼,我不能改變,所以我想將@NotNull添加到幾乎所有函數的參數中。 (未來可能會有更多的限制)。 – Alex 2011-12-21 07:12:29

+0

hups輸入發送它。所以無論如何,我正在考慮使用net.sf.oval - 這不是說該庫的目的?因爲正如你所說的,驗證僅僅是控制器和模型的必要條件。目前我有很多很多「if(... == null)throw ...」 – Alex 2011-12-21 07:14:58

+0

我現在得到void test(@NotNull String a){new Validator()。assertValid(a); }如果我傳遞null,則失敗。但是,這幾乎相同,如果使用null然後拋出。據我所知,我需要使用一個aspectj編譯器來進行自動vaidation,但是我無法找到關於如何使用play framework來做的事情。 – Alex 2011-12-21 10:32:44

1

如果有人仍然需要這個。

您可以使用與控制器中完全相同的方式在所有類中使用Play註釋進行驗證。 只需使用validate插件。