我有一个域类,其中包含一些自定义验证程序,如下所示:
class Domain {
String attribute1
OtherDomain attribute2
static constraints = {
attribute2 nullable: true, validator: {OtherDomain od, Domain d ->
if (od) {
log.debug "entering validation"
// certain validation here
}
}
}
为了更新,我在相应的DomainController
中有一个简单的操作:
@Transactional
def update(Domain domainInstance) {
log.debug "entering update()"
// rest of update
}
我想知道为什么在debuglog
我按以下顺序收到调试消息:
entering validation
entering update()
问题是此时验证失败(StackOverflowError
)。我知道这个错误的原因,我知道如何绕过这个错误(在update
行动中这样做)。但是,在程序进入update()
操作之前,我不知道为什么会有验证。而且我现在还不知道如何阻止验证。
你有什么建议吗?
答案 0 :(得分:2)
您看到"进入验证的原因"之前的消息"进入更新()"是因为你声明了一个Domain
类型的命令对象。这意味着Grails会将任何请求参数绑定到domainInstance
,然后在执行操作之前调用validate()
, 。这允许您编写如下代码:
@Transactional
def update(Domain domainInstance) {
// at this point request params have been bound and validate() has
// been executed, so any validation errors will be available in
// domainInstance.errors
if (domainInstance.hasErrors() {
// do something
}
log.debug "entering update()"
}