Grails3 generate-all 生成错误的创建操作代码

Grails3 generate-all generates faulty create action code

当我使用 generate-all package.DomainObject 时,它会生成一个控制器,其中生成的创建操作如下:

def create() {

respond new DomainObject(params)   

}

当我调用 localhost:8080/DomainObject/create 时,即使没有进行任何代码更改,它也会引发异常:

groovy.lang.MissingPropertyException: No such property: controller for class: package.DomainObject

对于 params 映射具有而 DomainObject 不具有的属性,内省似乎失败了。这是令人惊讶的,因为在 grails 2 中,内省过去只是忽略不匹配的属性,它也曾经对字段进行必要的类型转换(现在如果 DomainObject 有一个 int 属性,它会抛出一个类型不匹配异常,因为 params 映射将其作为字符串传递)。
这实在是太不方便了。有什么变化或我遗漏了什么吗?

在 Grails 中使用地图构造函数和批量设置属性与 Groovy 基本相同,但它具有排除 'controller'、'action' 和'format' 键以保持这样的控制器代码整洁。那打破了 3.x 和 has been reported in the issue tracker。它没有标记为已修复,但在一个简单的 3.0.4 测试应用程序中对我来说可以正常工作。

作为临时解决方法,您可以复制参数映射并删除存储在这些键下的值,并将 'fixed' 映射用于构造函数:

def create() {
   def fixedParams = ([:] + params) // copy
   ['controller', 'format', 'action'].each { fixedParams.remove it }
   respond new Thing(fixedParams)
}