Grails呈现空白页

Grails呈现空白页,grails,Grails,我正在使用Grails2.3.11 当我进入localhost:8080/myapp/inventory/show/3时,应用程序显示一个空白页面。debug甚至不会进入下面的任何方法 class QuestionnaireController { def beforeInterceptor = [action: this.&loadQuestionnaire, only: ['show']] Questionnaire questionnaireInstance def show

我正在使用Grails2.3.11

当我进入
localhost:8080/myapp/inventory/show/3
时,应用程序显示一个空白页面。debug甚至不会进入下面的任何方法

class QuestionnaireController {

def beforeInterceptor = [action: this.&loadQuestionnaire, only: ['show']]

Questionnaire questionnaireInstance

def show = {
    render(view: 'show', model: [questionnaire: questionnaireInstance])
}

private def loadQuestionnaire() {
    questionnaireInstance = Questionnaire.findById(params.id)

    if(!questionnaireInstance) {
        redirectWhenNotFound(params.id)
    }
}

private def redirectWhenNotFound(def id) {
    flash.message = message(code: 'default.not.found.message', args: [
            message(code: 'questionnaire.label'),
            id
    ])
    redirect(uri: "/")
}
但是,当我尝试
localhost:8080/myapp/questionly/show
时,它转到
loadQuestionly()
,显然找不到域实例,因为
params.id
不存在,所以它转到
redirectWhenNotFound()
,并将其正确重定向到主页面

问题是-为什么它不能正常工作

编辑

只有当存在具有给定id的实例时,它才会显示空白页,当没有实例时,它进入方法


最后我找到了解决方案,如下所示。

在检查了更多内容后,它只有在有一个具有给定id的实例时才会失败,而在没有具有给定id的实例时才会通过该方法,事实证明,
调查问卷
表中有一列拼写错误
,Grails在编辑它之后更新了模式,而没有删除旧的

可能这就是问题所在,因为我删除了该列,删除了所有行,重新启动了应用程序,创建了一个新实例,现在就可以工作了


问题是它一直在默默地失败,所以我将这个答案留给将来可能会遇到同样问题的任何人。

您是否尝试过在没有
之前拦截程序
和没有
问题回复
?这似乎可以用一种更简单的方法来实现,而在控制器中保留实例变量通常不是一个好主意。@tylerwal这个项目有一个非常类似的例子,不同之处在于在同一个控制器中使用
操作
重定向,而不是
uri
。如果你说这不是一个好主意,那么最好证明这个观点是正确的。这可能不是最好的想法,但它允许简化代码,并且在许多方法中不重复相同的步骤。我最初的评论是关于认为控制器应该是单例作用域的,并且存在并发问题的风险,但是在研究之后,它们实际上是请求作用域的,问题并没有那么严重。我仍然认为这段代码可以在没有拦截器的情况下以一种更简单的方式压缩和编写。您知道这不是控制器中的唯一操作吗?你在发表完全脱离主题的评论,即使它们是“关于主题”,你也没有提供任何更好的解决方案(具体是什么?)。。。对不起,我看不出重点。如果你不能提供有用的信息或任何实际建议,那么最好删除这些评论。我不是想冒犯你-评论的目的是询问更多信息或提出改进建议。我不是要回答你的问题,为什么你的控制器呈现一个空白页面,因此我不是在发布答案,而是建议改进。似乎将
问卷
的获取作为一个操作参数来改进,而不是在拦截器中:
def show(@RequestParameter('id')inventory questionnairencence)={
然后在必要时在操作中重定向。