在Grails控制器的操作中使用"get"会导致即使未调用也会执行操作

use*_*781 6 grails

问题:控制器的动作具有渲染标记而不传入模型.存在以"get"一词开头的动作.

在grails-app /视图/网站/ home.gsp:

homepage
Run Code Online (Sandbox Code Playgroud)

SiteController.groovy:

class SiteController {

    def index() {
        render (view: "home")
    }

    def getTest() {
        render "getTest"
    }

}
Run Code Online (Sandbox Code Playgroud)

该站点在localhost:8080/site上访问,以执行SiteController的索引操作.

预期输出:主页实际输出:getTest主页

如果index的render动作更改为:

render(view: "home", model: [:])
Run Code Online (Sandbox Code Playgroud)

产生预期的输出.

如果在操作名称中的单词get之前添加了一个字符,则会生成预期的输出.

有趣的是,getEA()在IDEA中的颜色编码为紫色.还应该注意的是,如果你有多个方法在开头有单词get,它们都是ALL执行的.

这在Grails 1.3.6中没有发生.这在一个全新的Grails 2.2.2项目中是可重现的,对我来说似乎是个错误.为什么会这样?

Ian*_*rts 8

GRAILS-9310表明这是一个已知的限制,不会更改,解决方法不是命名您的操作get*.根本原因是

如果未返回显式模型,则控制器的属性将用作模型(Grails docs)

定义getTest()方法时,这意味着控制器具有test属性,当您在没有显式模型的情况下呈现"主"视图时,将枚举控制器属性以形成模型映射.该getTest()方法将作为此枚举过程的一部分进行调用.

如果您确实需要getTest出现在URL中,则必须将实际操作命名为其他操作,然后定义自定义URL映射以将/controller/getTestURI指向重命名的操作.