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
has controller as alpha
、 action asindex
和 view as /WEB-INF/grails-app/views/alpha/index.gsp
,但是随后调用/beta/index
has controller as 、beta
view as index
、但是 view as /WEB-INF/grails-app/views/alpha/index.gsp
(注意这里错误的“alpha”)。随后的调用alpha
仍然没问题。
如果我们从 beta 开始,然后转到 alpha,情况就会相反(没问题beta
,alpha
坏了)。
我尝试在 JPDA 下运行它,但是当我的 IDE 似乎正在连接时,它实际上并没有遇到任何断点(可能是不相关的问题)。
我正在使用 Grails 2.3.0、JDK 1.6 和 Tomcat7。
我可以在日志中看到没有什么不好的。
任何想法可能是什么问题,甚至只是如何进行调试?
http://goo.gl/aFKYYb <-- grails 应用
http://goo.gl/aDP6Lx <-- .war 文件