2011-11-18 108 views
8

我們正在尋找一個Java庫/系統/軟件包,它不僅可以進行基本驗證,還可以進行關係驗證。我們需要能夠表達基於多個相關實體的驗證標準。Java模型驗證

大多數驗證模型Spring Validation,JSR303專門用於驗證bean的屬性。但是我們需要一些可以跨越豆類的東西。

我們的需求是想出一個驗證模型狀態的方法,同時將驗證邏輯外化爲java代碼。

在上面的定義中,Bean只是一個POJO,而一個模型是一個相關Bean的集合。因此,例如,如果帳戶具有地址集合並且Account.countryOfResidence設置爲美國,我希望有一個驗證規則來確保所有地址在其中都有一個美國國家。

因此,在向帳戶添加地址的「操作」期間,驗證會啓動,以確保Address.country與Account.countryOfResidence相同。

我們正在調查DRULES,但想看看是否有其他選項可用。

關於如何進行的任何建議?

+0

在你的上下文中,什麼是模型,什麼是「模型狀態」,什麼是驗證?如果他們知道你在尋找什麼,它可能會幫助人們做出答案。 – CPerkins

+1

爲什麼你想避免Java驗證? Java看起來是最具表現力的語言,擁有大量可用的API,並且可以輕鬆訪問Java對象。 –

+0

你能提供一個樣本嗎? – Puce

回答

1

不知道如何積極的這個項目,但我前一陣子使用它,它提供的功能做你描述 - 看看,看看它是否可能會有所幫助:

http://i-screen.org/docs/index.html

當然還有Jess: http://www.jessrules.com/jess/

這也值得一看,雖然我對此不太瞭解。 弗拉德:http://www.sapia-oss.org/projects/vlad/

+0

Jess的另一個選擇是JBoss Project,以前稱爲Drools。我不喜歡這些內容是1)XML; 2)在單獨文件中定義的驗證規則; 3)驗證在一個單獨的XML文件中定義。 –

0

我認爲這是可能的JSR 303做的ScriptAssert validatorcustom validator

This question有幾個自定義的跨領域驗證器可以用作創建自己的基礎。

這裏是一個@ScriptAssert驗證器的例子。

@ScriptAssert(lang="javascript", script="_this.countryOfResidence.equals(_this.address.country)") 
// @ScriptAssert(lang="jexl", script="_this.countryOfResidence == _this.address.country") 
public class Account { 
    @NotNull @Valid 
    private Address adddress; 

    private String countryOfResidence; 
} 

public class Address { 
    ... 
    @NotNull 
    private String country; 
} 

這當然比自定義驗證程序少得多的代碼。


注意:驗證器也可以用XML創建(如果這是您的方式)。

0

我很失望這個空間有什麼 - 可能是因爲我想要一個不可能的功能組合 - 吃蛋糕和吃東西。所以這更多的是通過比什麼更長的評論,至少考慮答案。我把這個問題標記爲「最喜歡的」,希望別人能指點我們一個主要的子彈。但我猜這房子裏沒有巫師。

其中一種可能性是OCL,特別是隨相關Eclipse插件提供的支持。我看過它並拒絕了它,因爲它看起來不值得 - 但你的里程可能會有所不同。

另一種可能性(也許是!!!)是利用爲BDD編寫的工具之一。但是,這些是爲了測試而編寫的,而不是生產代碼 - 「給定方案x,我希望發生」。我指的是,如 easyb,jbehave和cucumber的cuke4duke端口 - 尤其是easyb。我認爲jbehave對你來說太重了,而且我還沒認真看待黃瓜。

如果您發現了一些適合您的東西,請回來並寫下您自己的答案。請注意,您有7個upvotes和4個最愛 - enquiring minds want to know