【问题标题】:use Java class as Grails command使用 Java 类作为 Grails 命令
【发布时间】:2011-04-07 10:30:02
【问题描述】:

我有一堆 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 命令行为?

【问题讨论】:

  • 让它们成为 Groovy 类是一个有效的选择吗?
  • 不幸的是,如果这是一个选项,那么我可以只注释它们@Validateable,我的问题就会得到解决

标签: grails groovy grails-validation grails-constraints


【解决方案1】:

我还没有尝试过,但是您可以使用 Groovy 的元编程功能来实现这一点。在您的Bootstrap.groovy 中,您可以将静态contraints 闭包添加到您要验证的所有Java 类中。还要用@Validateable 注释你的类。这是一个例子:

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

然后将这些类视为Command classes 来验证它们。

【讨论】:

  • 理论上它似乎应该可行,尽管我发现在 Groovy/Grails 中有些东西在理论上应该可行,但在实践中却不可行。测试完我会接受这个答案。
  • 我可以预见的一个问题是测试。 Bootstrap.init 在单元测试约束之前不会被调用,因此任何测试约束的单元测试都可能不起作用
  • 是的,您可能必须将此初始化代码放入一个单独的类中,并从Bootstrap.groovy 和您的测试代码中调用它。您可以从带有@BeforeClass 注释的测试基类中的方法调用该代码。另一种选择是编写BlockJUnit4ClassRunner 的实现。然后,您可以使用 @RunWith 注释选择要将扩展应用到哪个单元测试。
  • @Don:这种方法运气好吗?
【解决方案2】:

事实上,正如 Peter Ledbrook (SpringSource) 所述,Groovy 支持将约束“附加”到 Java 域类:

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

正如博文中所述,您显然不能在 Java 类中定义约束闭包。但是您可以通过遵循此命名约定创建一个 Groovy 类来附加约束元数据:

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

并将其放在 src/java 文件夹中。

看看上面提到的博文,对这个话题做了很好的介绍。

【讨论】:

  • 哦,我刚刚看到您指的是命令类,但这种方法也应该适用于它们。
猜你喜欢
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多