2010-12-15 93 views
1

工作,我跟着這裏的指令:http://www.grails.org/doc/latest/guide/7.%20Validation.htmlGrails的validateable不是非持久域類

,並加入到Config.groovy中

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

然後在的src /常規/暖色加入。 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」函數,t不起作用(「空白假」&「size:0..25」)。它總是返回false,即使當名稱> 25.

這是一個Grails錯誤,如果有,是否有任何解決方法?

我使用Grails 1.3.3

更新:我已經更新了簡化的代碼。現在我知道約束「大小」不能與「空白」一起使用,但仍然無效。

我的測試類測試/單位/ 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> 

更新2:如果我不使用單元測試,但嘗試調用hasErrors在控制器中,它運行但返回false值。 (hasErrors用Warm返回false('Hihi',3))。有沒有人有線索?

更新3:我跟維克多的方式,現在如果我叫hasErrors之前的validate()問題就解決了()。但我仍然不明白,爲什麼「grails generate-all」控制器在使用hasErrors()之前不必調用validate()?

+0

你之前調用過validate()嗎?我們可以有整個行動代碼嗎? – 2010-12-15 10:02:36

+0

還有User類的屬性。 – 2010-12-15 13:14:36

+0

我只是調用hasErrors()函數,而不是驗證()。是的,我會盡快更新這個問題。 – 2010-12-16 03:56:58

回答

4

確實之前需要調用validate() - 它會觸發驗證和更改對象狀態。看看ValidationGrailsPlugin.addValidationMethods(),我看到hasErrors()是一個只讀方法。

調用validate()後,您的示例適用於我。我在grails console試過(偉大的工具,我強烈推薦!):

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

我加@Validateable溫暖類。我相信這沒有區別。

+0

是的,它的工作原理。但你介意解釋爲什麼會發生這種情況?我的意思是,通過grails腳手架,他們調用hasErrors而沒有任何調用來驗證()? – 2010-12-23 03:27:09

+0

我其實不知道。快速grep僅在WebFlow插件中找到「validate()」或「validateInstance()」調用,而不是普通的腳手架。但這是事實。 – 2010-12-23 08:59:24

+0

現在我明白它爲什麼有效。您可能想要檢查http://stackoverflow.com/questions/4544582/what-is-the-connection-between-validate-and-haserrors – 2010-12-31 04:21:01

1

我不認爲在單元測試中添加了動態方法validate()hasErrors()。如果你把它移到一個集成測試中,他們應該在那裏。

+0

現在我在控制器中運行hasErrors,它不報告錯誤(應該報告時)。這意味着方法存在,但它們返回錯誤的值。 – 2010-12-21 04:18:42