Grails,如果发现错误,如何从域中发送消息(键入flash)?

时间:2017-04-19 09:39:38

标签: validation grails exception-handling

更新域实例时,我需要在允许更新之前检查一些数据。 我在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)
    }
}

我正在考虑抛出异常,但这看起来并不像我想象的那么容易。当我尝试上面的代码时,它说有类似的方法。我找不到任何示例或说明如何拨打电话。 所以主要的问题是如何告知用户这个问题? 这是使用异常的正确方法,那么我需要一些帮助如何做到这一点,否则我还能做什么? :(

2 个答案:

答案 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">&times;</span></button>
  ${message}
</div>

以上使用了bootstrap样式。

答案 1 :(得分:0)

但为什么要避免使用标准grails验证mechanism

只需定义约束validate()save(),如果flash将错误添加到hasErrors()

抛出异常可能会破坏您的交易(如果您保存在交易服务中,建议这样做。)