static constraints = {}
在文档中,他们说它在域中有效。如果我们在其中创建变量,我们可以在服务中应用约束吗?
答案 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注释。