2

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/indexhas controller as alpha、 action asindex和 view as /WEB-INF/grails-app/views/alpha/index.gsp,但是随后调用/beta/indexhas controller as 、betaview as index、但是 view as /WEB-INF/grails-app/views/alpha/index.gsp注意这里错误的“alpha”)。随后的调用alpha仍然没问题。

如果我们从 beta 开始,然后转到 alpha,情况就会相反(没问题betaalpha坏了)。

我尝试在 JPDA 下运行它,但是当我的 IDE 似乎正在连接时,它实际上并没有遇到任何断点(可能是不相关的问题)。

我正在使用 Grails 2.3.0、JDK 1.6 和 Tomcat7。

我可以在日志中看到没有什么不好的。

任何想法可能是什么问题,甚至只是如何进行调试?

http://goo.gl/aFKYYb <-- grails 应用

http://goo.gl/aDP6Lx <-- .war 文件

4

2 回答 2

1

升级到 Grails 2.3.1 为我解决了这个问题。(阅读您发布的缺陷为我指明了正确的方向 - 谢谢。)

请注意,您还必须将 hibernate 插件升级到版本 3.6.10.2,否则您将收到类似于“类 [] 上的方法已在 Grails 应用程序之外使用”的错误消息。

于 2013-11-06T00:12:13.410 回答
1

可能的 Grails 缺陷(尽管它们无法重现):

http://jira.grails.org/browse/GRAILS-10614

我做了一个“安装模板”并正在修改脚手架模板作为解决方法。

编辑 - 是的,确认;我忘了更新这个响应,但升级到 2.3.1 解决了这个问题,根据链接的缺陷。

于 2013-10-14T07:05:11.290 回答