2011-04-07 40 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