【发布时间】:2013-10-20 10:18:14
【问题描述】:
Grails 应用程序有大量使用新的 RESTful “响应”功能自动生成(来自标准 Grails 2.3.0 脚手架)代码。例如,索引方法通常如下所示:
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
respond Alpha.list(params), model:[alphaInstanceCount: Alpha.count()]
}
当应用程序作为“grails run-app”运行时,这完全可以正常工作,但是当应用程序被打包为 .war 并在非嵌入式 servlet 容器中以这种方式启动时会失败。
它适用于使用的第一个控制器/视图组合,但对于后续的组合使用第一个渲染视图的视图文件夹。例如,如果我们先尝试/alpha/index,然后再尝试/beta/index,那么/alpha/index 将正常工作,但/beta/index 将使用/alpha/index.gsp 进行渲染(而不是预期的/beta/index.gsp)。
但是,如果我将方法更改为:
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
render(view: 'index', model:[alphaInstanceList: Alpha.list(params), alphaInstanceCount: Alpha.count()])
}
那么它在两个部署选项中都可以正常工作。
我在一些 .gsp-s 中添加了一些调试代码以输出 ${this.getGroovyPageFileName()}、${controllerName} 和 ${actionName}。
这表明虽然控制器和操作名称始终是预期名称,但在第一个视图之后呈现的视图上使用的视图仍然是第一个视图上使用的视图。
例如,/alpha/index 的初始调用的控制器为 alpha,操作为 index,视图为 /WEB-INF/grails-app/views/alpha/index.gsp,但是后续调用 of /beta/index 的控制器为beta,查看为index,但查看为/WEB-INF/grails-app/views/alpha/index.gsp(请注意此处错误的“alpha”)。对 alpha 的后续调用仍然正常。
如果我们从 beta 开始,然后转到 alpha,情况就会相反(beta 很好,alpha 坏了)。
我尝试在 JPDA 下运行它,但是当我的 IDE 似乎正在连接时,它实际上并没有遇到任何断点(可能是不相关的问题)。
我正在使用 Grails 2.3.0、JDK 1.6 和 Tomcat7。
我在日志中没有看到任何不好的地方。
任何想法可能是什么问题,或者甚至只是如何进行调试?
【问题讨论】:
-
我看到了完全相同的行为。我认为这是一个 Heroku 问题,但看起来它可能是一般的 Grails。感谢您将调用“响应”转换为“渲染”
标签: grails model-view-controller