Grails “圣杯”;回应「;从.war文件启动时呈现错误的视图
Grails应用程序有许多使用新的RESTful“respond”特性自动生成的代码(来自标准Grails2.3.0 scaffolding)。例如,索引方法通常如下所示:Grails “圣杯”;回应「;从.war文件启动时呈现错误的视图,grails,model-view-controller,Grails,Model View Controller,Grails应用程序有许多使用新的RESTful“respond”特性自动生成的代码(来自标准Grails2.3.0 scaffolding)。例如,索引方法通常如下所示: def index(Integer max) { params.max = Math.min(max ?: 10, 100) respond Alpha.list(params), model:[alphaInstanceCount: Alpha.count()] } 当应用程序以“grails run a
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
,但是/beta/index
的后续调用将控制器设置为beta
,视图设置为索引
,但是查看为/WEB-INF/grails app/views/alpha/index.gsp
(请注意此处错误的“alpha”)。随后对alpha
的调用保持良好状态
如果我们从beta版开始,然后转到alpha版,情况会正好相反(beta
很好,alpha
坏了)
我试着在JPDA下运行它,但当我的IDE看起来正在连接时,它实际上并没有遇到任何断点(可能是无关的问题)
我正在使用Grails2.3.0、JDK1.6和Tomcat7
我在日志中看不到什么不好的东西
你知道问题可能是什么,甚至知道如何调试它吗
可能的颗粒缺陷(尽管无法复制):
我做了一个“安装模板”,并修改了脚手架模板作为一个解决办法
编辑-是,已确认;我忘记更新此响应,但升级到2.3.1解决了问题,正如链接的缺陷所示。升级到Grails 2.3.1为我修复了此问题。(阅读您发布的缺陷为我指出了正确的方向-谢谢。)
请注意,您还必须将hibernate插件升级到3.6.10.2版,否则将收到类似于“类[]上的方法在Grails应用程序外部使用”的错误消息。我看到了完全相同的行为。我认为这是一个Heroku问题,但看起来它可能是一般的圣杯。感谢您将调用转换为“响应”到“渲染”的解决方法