我们可以在Grails服务中进行验证吗

我们可以在Grails服务中进行验证吗,grails,groovy,Grails,Groovy,在文档中,他们说它在域中工作。如果我们在服务中创建变量,我们可以在服务中应用约束吗?来自grails文档(): 它们通常应用于域类,但是URL映射和命令对象也支持约束 所以答案是否定的。你不能按你的要求去做,也就是说,把一个约束块放到一个服务中,期望它被识别和使用。首先,该块属于哪个域类?服务不以任何方式绑定到单个域类,因此它将比创建块更复杂 但是,您可以将验证外部化。Grails在幕后使用SpringMVC,并从中获得验证支持。这种情况并不明显,但如果您查看ApplicationContext

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

来自grails文档():

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


所以答案是否定的。

你不能按你的要求去做,也就是说,把一个
约束
块放到一个服务中,期望它被识别和使用。首先,该块属于哪个域类?服务不以任何方式绑定到单个域类,因此它将比创建块更复杂

但是,您可以将验证外部化。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()
    }
}