我们可以在Grails服务中进行验证吗
在文档中,他们说它在域中工作。如果我们在服务中创建变量,我们可以在服务中应用约束吗?来自grails文档(): 它们通常应用于域类,但是URL映射和命令对象也支持约束我们可以在Grails服务中进行验证吗,grails,groovy,Grails,Groovy,在文档中,他们说它在域中工作。如果我们在服务中创建变量,我们可以在服务中应用约束吗?来自grails文档(): 它们通常应用于域类,但是URL映射和命令对象也支持约束 所以答案是否定的。你不能按你的要求去做,也就是说,把一个约束块放到一个服务中,期望它被识别和使用。首先,该块属于哪个域类?服务不以任何方式绑定到单个域类,因此它将比创建块更复杂 但是,您可以将验证外部化。Grails在幕后使用SpringMVC,并从中获得验证支持。这种情况并不明显,但如果您查看ApplicationContext
所以答案是否定的。你不能按你的要求去做,也就是说,把一个
约束
块放到一个服务中,期望它被识别和使用。首先,该块属于哪个域类?服务不以任何方式绑定到单个域类,因此它将比创建块更复杂
但是,您可以将验证外部化。Grails在幕后使用SpringMVC,并从中获得验证支持。这种情况并不明显,但如果您查看ApplicationContext
中的所有bean,您将看到每个域类都有一个关联的验证器bean,它实现Spring的validator
接口,并使用约束
块中定义的规则进行验证。您可以通过实现该接口并执行您喜欢的任何检查来执行类似的操作。解析约束块会很棘手,因为它有一个自定义DSL,所以您需要了解Grails是如何解析它的,并执行相同的操作
如果你想了解更多细节,我写了这篇文章。我会将其复制/粘贴到这里-我不想创造销售-但这有点牵强,您最好使用标准方法。我只是想知道如何做我描述的有趣的事情,并认为在书中添加说明Grails使用Spring的多种方式之一会很有趣。您不应该验证服务。最好查看命令对象或注释 如果我们在服务中创建变量,我们可以在服务中应用约束吗 对。很久以前,我们引入了
@Validateable
注释,它允许您创建几乎任何用Groovy编写的类,包括服务类,都是可验证的。请参见包含以下内容的项目:
grails应用程序/services/demo/PeculiarService.groovy
static constraints = {}
测试/单元/演示/PeculiarServiceSpec.groovy
package demo
@grails.validation.Validateable
class PeculiarService {
String someString
static constraints = {
someString matches: /[A-Z].*/
}
}
请注意,如果您的服务具有这样的状态,您几乎肯定不希望该服务是单例的,这是默认范围。此外,几乎可以肯定的是,没有充分的理由使服务可验证,但问题的答案是“是”。默认情况下,对服务方法的访问是不同步的,因此没有任何东西可以阻止这些方法的并发执行。事实上,由于服务是单例的,并且可以并发使用,所以在存储服务中的状态时应该非常小心。或者走简单(更好)的路,永远不要在服务中存储状态。@Abdullah如果问题是“告诉我使用服务时的好技术或最佳实践”,你的评论将是一个很好的回答。然而,这几乎与被问到的实际问题无关。这与状态无关,而是关于可变状态,更具体地说,是可变状态的变异。运行时,
约束
块不会发生任何变化,因此这不会成为线程安全问题。@BurtBeckwith-我以后会记住这一点,谢谢你的建议。是的,我知道这一点,但我们的问题是,我们使用的是使用Spring Data Neo4j的Neo4j数据库,但我们没有为Neo4j使用Grails插件。所以,如果我们在域包中创建我们的域,那么Grails会创建问题,所以我们决定在任何其他包中创建我们的域,这就是为什么我要问这个问题,谢谢
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()
}
}