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
,但 结果/beta/index
的调用 控件为beta
,查看为index
,但查看为/WEB-INF/grails-app/views/alpha/index.gsp
( 注意错误“alpha”在这里 )。随后对alpha
的调用仍然没有问题。
如果我们已经开始使用测试版,然后转移到alpha版,则反过来(beta
很好,alpha
已损坏)。
我尝试在JPDA下运行它,但是当我的IDE似乎正在连接时,它实际上没有遇到任何断点(可能是无关的问题)。
我正在使用Grails 2.3.0,JDK 1.6和Tomcat7。
我可以在日志中看到任何不好的内容。
任何想法可能是什么问题,甚至只是如何进行调试?
http://goo.gl/aFKYYb< - grails app
http://goo.gl/aDP6Lx< - .war文件
答案 0 :(得分:1)
可能的Grails缺陷(尽管它们无法重现):
http://jira.grails.org/browse/GRAILS-10614
我做了一个“安装模板”,并且正在修改脚手架模板作为解决方法。
编辑 - 是的,确认;我忘了更新此响应,但升级到2.3.1解决了问题,根据链接的缺陷。
答案 1 :(得分:1)
升级到Grails 2.3.1为我解决了这个问题。 (阅读你发布的缺陷指出我正确的方向 - 谢谢。)
请注意,您还必须将hibernate插件升级到版本3.6.10.2,否则您将收到类似于“Grails应用程序之外的类[]上的方法”的错误消息。“