我们可以在服务Grails中验证

时间:2014-10-31 12:46:42

标签: grails groovy

static constraints = {}

在文档中,他们说它在域中有效。如果我们在其中创建变量,我们可以在服务中应用约束吗?

4 个答案:

答案 0 :(得分:1)

您不能按照要求执行操作,即将constraints块放入服务中并期望识别并使用它。首先,该块所属的域类是什么?服务不以任何方式绑定到单个域类,因此它比仅创建块更具参与性。

但您可以外部化验证。 Grails使用Spring MVC,并从中获得验证支持。发生这种情况并不明显,但如果你查看ApplicationContext中的所有bean,你会看到每个域类都有一个实现Spring Validator接口的关联验证器bean,它使用它constraints块中定义的规则进行验证。您可以通过实现该接口并执行您喜欢的任何检查来执行类似的操作。解析约束块会很棘手,因为它有一个自定义DSL,所以你需要看看Grails如何解析它并做同样的事情。

如果你想了解更多细节,我写了这篇in my book。我会在这里复制/粘贴 - 我不是在试图产生销售 - 但它有点牵强,你最好不要使用标准方法。我只是想出了如何做我所描述的有趣的事情,并认为添加到本书来说明Grails使用Spring的众多方法之一会很有趣。

答案 1 :(得分:1)

  

如果我们在服务中创建变量,我们可以在服务中应用约束吗?

是。很久以前我们引入了@Validateable注释,它允许你创建任何用Groovy编写的类,包括Service类,可验证。请参阅https://github.com/jeffbrown/validateableservice中的项目,其中包括以下内容:

的grails-app /服务/演示/ PeculiarService.groovy

package demo

@grails.validation.Validateable
class PeculiarService {

    String someString

    static constraints = {
        someString matches: /[A-Z].*/
    }
}

测试/单元/演示/ PeculiarServiceSpec.groovy

package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(PeculiarService)
class PeculiarServiceSpec extends Specification {

    void "test validation"() {
        when: 'someString begins with a lower case letter'
        service.someString = 'invalid'

        then: 'validation fails'
        !service.validate()

        when: 'someString begins with an upper case letter'
        service.someString = 'Valid'

        then: 'validation passes'
        service.validate()
    }
}

请注意,如果您的服务具有这样的状态,您几乎肯定不希望该服务是单例,这是默认范围。此外,几乎可以肯定没有任何理由使服务可以验证,但问题的答案是“是”。

答案 2 :(得分:0)

来自grails docs(http://grails.org/doc/2.3.4/guide/single.html#validation):

  

最常见的是它们应用于域类,但URL映射和命令对象也支持约束。

所以答案是否定的。

答案 3 :(得分:0)

您不应该验证服务。更好地查看命令对象或@Validatable注释。