2011-04-07 42 views
0

我有一堆Java類,我想在我的Grails控制器中用作命令類。一個典型的例子是:使用Java類作爲Grails命令

class Person { 
    String name 
    Integer age 

    public String getName() {return name;} 
    public String getAge() {return age;} 
    public void setName(String name) {this.name = name;} 
    public void setAge(Integer age) {this.age = age;} 
} 

我希望能爲這一類,這樣我可以稱之爲validate()上,任何驗證錯誤將被存儲在errors屬性指定的約束。換句話說,它的行爲就像普通的Grails命令類一樣。

顯然,我不能直接在.java源文件中聲明約束閉包,因爲Java不支持閉包。有什麼方法可以修改這些類(在運行時),以添加Grails命令行爲?

+0

是否讓他們成爲Groovy類的有效選擇? – 2011-04-07 13:44:01

+0

不幸的是,如果這是一個選項,那麼我可以只註釋他們@Validateable和我的問題將被解決 – 2011-04-07 17:02:52

回答

2

我還沒有嘗試過,但可以使用Groovy的元編程功能來實現此目的。在您的Bootstrap.groovy中,您可以將靜態contraints閉包添加到您要驗證的所有Java類。還用@Validateable註釋您的課程。這裏有一個例子:

Person.metaClass.static.constraints = { name blank: false } 

然後對待這些類像Command classes來驗證它們。

+0

理論上它似乎應該工作,雖然我發現在Groovy/Grails的某些事情應該在理論上工作,在實踐中。在我測試完成後我會接受這個答案。 – 2011-04-08 08:12:24

+0

我可以預測的一個問題是測試。 Bootstrap.init在單元測試約束之前不會被調用,所以任何測試約束的單元測試都可能不起作用 – 2011-04-08 08:13:26

+0

是的,你可能必須把這個初始化代碼放到一個單獨的類中,並從'Bootstrap'中調用它。 groovy'和你的測試代碼。你可以從'@ BeforeClass'註釋的測試基類中的方法調用該代碼。另一個選擇是編寫一個'BlockJUnit4ClassRunner'的實現。然後,您可以使用'@ RunWith'註釋挑選想要應用您的擴展的單元測試。 – 2011-04-08 13:34:28

0

事實上Groovy支持「連接」約束的Java域類,如彼得·萊德布魯克(SpringSource的)描述:

http://blog.springsource.com/2010/08/26/reuse-your-hibernatejpa-domain-model-with-grails/

正如在博客中,你顯然不能定義約束在Java類中關閉。

[package.to.your.dc.MyDomainClass] Constraints.groovy

,並把這個在src:但是你可以通過創建一個Groovy類下面這個命名約定附加約束元數據/ java文件夾。

看看上面提到的博客文章,這是一個非常好的介紹這個話題。

+0

哦,我剛剛看到你指的是命令類,但這種方法也適用於他們。 – 2011-04-15 06:42:18