更新域实例时,我需要在允许更新之前检查一些数据。 我在beforUpdate方法中创建了它并阻止了更新,但在flash消息中你可以读到“Domain 68 updated!”这不是我想要向用户展示的内容。
beforeUpdate看起来像这样:
def beforeUpdate() {
def oldVolume = getPersistentValue('volumeInStock')
if (oldVolume != volumeInStock && oldVolume!=volumeInitial){
throw new ValidationException("Changing InStock not allowed after offer/sold or planed volumes added!",this)
}
}
我正在考虑抛出异常,但这看起来并不像我想象的那么容易。当我尝试上面的代码时,它说有类似的方法。我找不到任何示例或说明如何拨打电话。 所以主要的问题是如何告知用户这个问题? 这是使用异常的正确方法,那么我需要一些帮助如何做到这一点,否则我还能做什么? :(
答案 0 :(得分:0)
我倾向于为我的控制器使用通用的异常处理机制,如下所示适用于大多数场景,如果您需要执行除了将消息呈现到屏幕之外的其他内容,这可能对您不起作用。
trait ControllerExceptionHandler {
def handleException( Exception e ) {
def msg = e.message ?: e?.cause?.message
flash.fail = msg
log.info msg
return
}
}
然后你的控制器实现了这个特性:
class MyController implements ControllerExceptionHandler {
def save() {
// do something that might throw an exception, if it does the ControllerExceptionHandler will deal with it
// it worked
flash.message = message( code: 'default.success.message' )
}
}
在你的gsps中:
<g:render template="/templates/alerts"/>
视图/模板/ _alerts.gsp
<g:if test="${flash.message}">
<g:render template="/templates/message" model="[type: 'info', message: flash.message]" />
</g:if>
<g:if test="${flash.fail}">
<g:render template="/templates/message" model="[type: 'danger', message: flash.fail]" />
</g:if>
视图/模板/ _message.gsp
<div class="alert alert-${type} alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
${message}
</div>
以上使用了bootstrap样式。
答案 1 :(得分:0)
但为什么要避免使用标准grails验证mechanism?
只需定义约束validate()
或save()
,如果flash
将错误添加到hasErrors()
。
抛出异常可能会破坏您的交易(如果您保存在交易服务中,建议这样做。)