【问题标题】:Grails validateable not work for non-persistent domain class可验证的 Grails 不适用于非持久域类
【发布时间】:2010-12-15 09:45:20
【问题描述】:

我按照这里的说明进行操作:http://www.grails.org/doc/latest/guide/7.%20Validation.html

并添加到 config.groovy

grails.validateable.classes = [liningtest.Warm']

然后在src/groovy/Warm.groovy中添加(它是一个非持久域类):

package liningtest

import org.codehaus.groovy.grails.validation.Validateable


class Warm {
  String name;
  int happyCite;

  Warm(String n, int h) {
    this.name = n;
    this.happyCite = h;
  }

  static constraints = {
    name(size: 1..50)
    happyCite(min: 100)
  }
}

但它对于“hasErrors”函数不起作用(“空白错误”和“大小:0..25”)。它总是返回 false,即使名称大于 25。

这是一个 Grails 错误吗,如果是,有什么解决方法吗?

我正在使用 Grails 1.3.3

更新:我已经更新了简化代码。现在我知道约束“大小”不能与“空白”一起使用,但仍然不起作用。

我在 test/unit/liningtest/WarmTests.groovy

中的测试类
package liningtest

import grails.test.*

class WarmTests extends GrailsUnitTestCase {
  protected void setUp() {
    super.setUp()
  }

  protected void tearDown() {
    super.tearDown()
  }

  void testSomething() {
    def w = new Warm('Hihi', 3)
    assert (w.happyCite == 3)

    assert (w.hasErrors() == true)
  }
}

我得到的错误:

<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="1" failures="0" hostname="evolus-50b0002c" name="liningtest.WarmTests" tests="1" time="0.062" timestamp="2010-12-16T04:07:47">
  <properties />
  <testcase classname="liningtest.WarmTests" name="testSomething" time="0.062">
    <error message="No signature of method: liningtest.Warm.hasErrors() is applicable for argument types: () values: []
Possible solutions: hashCode()" type="groovy.lang.MissingMethodException">groovy.lang.MissingMethodException: No signature of method: liningtest.Warm.hasErrors() is applicable for argument types: () values: []
Possible solutions: hashCode()
    at liningtest.WarmTests.testSomething(WarmTests.groovy:18)
</error>
  </testcase>
  <system-out><![CDATA[--Output from testSomething--
]]></system-out>
  <system-err><![CDATA[--Output from testSomething--
]]></system-err>
</testsuite>

UPDATE 2:当我不使用单元测试,但尝试在控制器中调用 hasErrors 时,它运行但返回 false价值。 (hasErrors 使用 Warm('Hihi', 3) 返回 false)。有人知道吗?

更新 3:我遵循 Victor 的方式,现在如果我在 hasErrors() 之前调用 validate(),问题就解决了。但是我还是不明白,为什么“grails generate-all”控制器在使用hasErrors()之前不必调用validate()?

【问题讨论】:

  • 你之前有没有调用 validate() ?我们可以有完整的动作代码吗?
  • 还有User类的属性。
  • 我只是调用 hasErrors() 函数,而不是 validate()。是的,我会尽快更新问题。
  • @Stefan Armbruster:我已经更新了函数。请看一看。

标签: grails grails-validation


【解决方案1】:

真的需要在之前调用validate() - 它会触发验证并更改对象状态。查看ValidationGrailsPlugin.addValidationMethods(),发现 hasErrors() 是只读方法。

调用 validate() 后,您的示例对我有用。我试过grails console(很棒的工具,我强烈推荐它!):

Warm w = new Warm('')
w.hasErrors() // 'Result: false'
w.validate()
w.hasErrors() // 'Result: true'

我将@Validateable 添加到了Warm 类。我相信这没什么区别。

【讨论】:

  • 是的,它有效。但是你介意解释为什么会这样吗?我的意思是,通过 grails 脚手架,他们调用 hasErrors 而不调用 validate()?
  • 我其实不知道。快速 grep 仅在 WebFlow 插件中查找 validate()validateInstance() 调用,而不是在普通脚手架中。但这是事实。
  • 现在我明白它为什么起作用了。您可能需要检查stackoverflow.com/questions/4544582/…
  • 谢谢。您的意思是在分配属性时在持久对象上的第一阶段验证触发器??
  • 抱歉,我没有收到您的评论通知。不,就像你说的,hasErrors 只有在你尝试先保存或验证对象时才有意义。
【解决方案2】:

我不认为在单元测试中添加了 validate()hasErrors() 动态方法。如果你把它移到集成测试中,它们应该在那里。

【讨论】:

  • 现在我在控制器中运行 hasErrors,它不报告错误(什么时候应该报告)。这意味着方法存在,但它们返回 false 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多