Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?

Posted

技术标签:

【中文标题】Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?【英文标题】:Grails: how to return error message from controller logic (i.e. not originating from domain property validation)? 【发布时间】:2012-08-28 08:57:18 【问题描述】:

错误,例如使用域或命令对象验证无法始终合理地检查错误的用户输入。

例如创建“忘记密码”功能时,如果用户输入数据库中不存在的用户名,我想显示足够的消息。所以控制器动作会做这样的事情

...
def user = User.findname==uname
if(!user) 
    // user not found in db, output error and render view again
    render view: 'forgotPassword'
    return

// do reset password stuff
...

我应该怎么做才能在<g:hasErros>标签内的视图中显示错误?

flash.message(正如生成的控制器/视图所做的那样)对我来说似乎不正确,因为我不仅显示信息消息,而且显示错误消息。这就是为什么我认为该消息应该由<g:hasErros> 标签处理并像域验证错误一样显示。 (对于用户来说,反馈级别相同:“由于输入错误而无法工作”。

创建@Validateable 命令对象似乎也不对。恕我直言,根据数据库检查值实际上不是命令对象中验证的责任吗?或者是吗?那么它对我来说似乎有点太复杂了。

那么最好的方法是什么?其他框架(例如 Wicket)提供了不同的方法,例如 error(String msg)info(String msg),它们可以轻松处理视图中的反馈消息。 Grails中是否有类似的概念,我只是还没有找到?

【问题讨论】:

对于那些对我在 Burt beckwith 和 Ian Robers 的输入基础上构建的最终解决方案感兴趣的人:不幸的是,我不允许发布源代码,但总的来说我只是创建了一个 TagLib两个成员:#1 向闪存范围写入添加消息,例如myproject.message(error:'User does not exist')myproject.message(success:'Password changed') 根据类型(错误/成功/警告/信息),将所有消息添加到 flash 中四个列表之一中的两个。成员 #2 是显示消息的实际标签,将所有消息呈现到页面中。它还检索 flash.message 和 bean 错误。希望这会有所帮助 【参考方案1】:

flash 只是一个 Map,你可以在其中放任何你想要的东西——字符串、数字、对象等。它很方便,因为它只持续一个请求,所以它只是暂时污染会话。生成的 GSP 中的约定是使用 message 键,但这只是一个约定。

如果您想存储另一条消息,请将其存储在不同的密钥中:

flash.warning = '...'

flash.error = '...'

并像其他消息一样在 GSP 中检索它。

【讨论】:

确实,这是我在项目中使用的方法 - 我定义了一个处理 flash.messageflash.warningflash.error 的标记库,然后我只需要将 <g:flashMessages/> 放在我的视图中/脚手架模板/布局。 谢谢,我不知道 flash 是地图 :) 这适用于示例案例,但如果你需要一个组合,例如从控制器输出两条错误消息以及更多来自“经典”域验证的可能性? @IanRoberts 感谢您的意见...为此编写一个标记库似乎是个好主意 - 如果我也教它处理 <g:haserrors> 内部的内容,这可能是最好的解决方案我的用例...而且我可能会将错误消息列表放入flash 而不仅仅是一个...应该可以...我会试试这个。 刚刚做了一些测试,我认为这种方法会奏效,而且它比我在研究网络时发现的所有方法都要干净。感谢你们两位的宝贵意见:)

以上是关于Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 grails 中实现请求超时?

在 grails 中处理来自服务的错误

如何在 Grails 中显示异常?

如何使用 jQuery 和 ASP.NET MVC 从 AJAX 调用返回错误消息?

如何从控制器方法验证返回自定义错误消息

服务中的 Grails 消息源错误