grails中save和update方法的习惯用法
grails中是否有任何习惯用法可以帮助我们保存域对象 比如说 我可能想做一些类似的事情grails中save和update方法的习惯用法,grails,save,Grails,Save,grails中是否有任何习惯用法可以帮助我们保存域对象 比如说 我可能想做一些类似的事情 if(candidate.hasErrors | | |!candidate.save) { 每一个{ 记录下来 } 但是,我不想将逻辑扩展到我在domainObject.save中使用的所有地方 我也不希望像say repo这样的单独类,我将这个domainObject传递给它,并将其放入这个逻辑中 谢谢 Sudarshan这里有一个我用来验证和保存的服务方法,但在失败时记录已解决的验证消息。使用它而
if(candidate.hasErrors | | |!candidate.save)
{
每一个{
记录下来
}
但是,我不想将逻辑扩展到我在domainObject.save中使用的所有地方
我也不希望像say repo这样的单独类,我将这个domainObject传递给它,并将其放入这个逻辑中
谢谢
Sudarshan这里有一个我用来验证和保存的服务方法,但在失败时记录已解决的验证消息。使用它而不仅仅是
println error
或log.warn error
,这是很有帮助的,因为错误对象的toString()非常详细,您只想看看GSP上会显示什么:
class MyService {
def messageSource
def saveOrUpdate(bean, flush = false) {
return validate(bean) ? bean.save(flush: flush) : null
}
boolean validate(bean) {
bean.validate()
if (bean.hasErrors()) {
if (log.isEnabledFor(Level.WARN)) {
def message = new StringBuilder(
"problem ${bean.id ? 'updating' : 'creating'} ${bean.getClass().simpleName}: $bean")
def locale = Locale.getDefault()
for (fieldErrors in bean.errors) {
for (error in fieldErrors.allErrors) {
message.append("\n\t")
message.append(messageSource.getMessage(error, locale))
}
}
log.warn message
}
bean.discard()
return false
}
return true
}
下面是控制器中的一个示例:
class MyController {
def myService
def actionName = {
def thing = new Thing(params)
if (myService.saveOrUpdate(thing)) {
redirect action: 'show', id: thing.id
}
else {
render view: 'create', model: [thing: thing]
}
}
}
编辑:也可以将这些方法添加到元类中,例如在BootStrap.groovy中:
class BootStrap {
def grailsApplication
def messageSource
def init = { servletContext ->
for (dc in grailsApplication.domainClasses) {
dc.metaClass.saveOrUpdate = { boolean flush = false ->
validateWithWarnings() ? delegate.save(flush: flush) : null
}
dc.metaClass.validateWithWarnings = { ->
delegate.validate()
if (delegate.hasErrors()) {
def message = new StringBuilder(
"problem ${delegate.id ? 'updating' : 'creating'} ${delegate.getClass().simpleName}: $delegate")
def locale = Locale.getDefault()
for (fieldErrors in delegate.errors) {
for (error in fieldErrors.allErrors) {
message.append("\n\t")
message.append(messageSource.getMessage(error, locale))
}
}
log.warn message
delegate.discard()
return false
}
return true
}
}
}
}
这取决于作用域中的“log”变量,在任何Grails工件中都是如此。这稍微改变了控制器的使用:
class MyController {
def actionName = {
def thing = new Thing(params)
if (thing.saveOrUpdate()) {
redirect action: 'show', id: thing.id
}
else {
render view: 'create', model: [thing: thing]
}
}
}
作为元类方法,重命名它可能更有意义,例如,
saveWithWarnings()
我不明白您为什么不想使用helper类,这是一个常见的问题practice@Miguel:我想理解你的意思,我不太相信这个解决方案,原因如下。假设我有一个accountService,它执行一些逻辑,然后保存accountDetails。我需要一些类似“code”的东西ass AccountService{def commonCrudService void accountlogic(){…logic here commonCrudService.saveOrUpdate(account)}……我想避免将一个单独的服务注入到我的所有其他服务中。我在寻找一些东西,比如巧妙地使用闭包或挂接到save方法中,这些行中的某些东西正是我想要的:)
class MyController {
def actionName = {
def thing = new Thing(params)
if (thing.saveOrUpdate()) {
redirect action: 'show', id: thing.id
}
else {
render view: 'create', model: [thing: thing]
}
}
}