Grails 命令对象未绑定到 'def' 类型

Grails command object not binding to 'def' type

尝试将参数绑定到定义为 'def' 的命令对象字段时遇到问题。

我有以下命令对象:

package command

import grails.validation.Validateable

@Validateable
class TestBindCommand {

    String fieldType
    def fieldValue
}

我有以下控制器来测试参数是否已正确绑定:

package command.binding

import command.TestBindCommand

class TestBindingController {

    def index() { }

    def testBinding(TestBindCommand testBindCommand) {
        println("fieldType: " + testBindCommand.fieldType)
        println("fieldValue: " + testBindCommand.fieldValue)
        render("fieldType: ${testBindCommand.fieldType} - fieldValue: ${testBindCommand.fieldValue}")
    }
}

最后,我有以下 ajax 请求 post 上述 testBinding 方法的参数:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Index</title>
</head>
<g:javascript library="jquery" plugin="jquery"/>
<script>
    $( document ).ready(function() {
        $.post('/command-binding/testBinding/testBinding', { fieldType: "String", fieldValue : "hello world"},
            function(returnedData){
                console.log(returnedData);
            });
    });
</script>
<body>
Index Page
</body>
</html>

如果将 fieldValue 的类型更改为 String,它就会开始绑定。如果您随后将其切换回 def,它仍然有效吗?!如果您执行 grails clean 并重新启动应用程序并将 fieldValue 设置为 def 那么它将不再工作!?我已经调试到 DataBindingUtils.java 并且当它是 'def'.

类型时,它似乎没有被添加到白名单中

示例项目可以在这里找到:

https://github.com/georgy3k/command-binding

Grails 版本 2.5.6

I've debugged down into the DataBindingUtils.java and it appears that the field isn't getting added to the whitelist when it is of type 'def'.

这是正确的,而且是设计使然。默认情况下,动态类型属性不参与大量 属性 数据绑定。

来自https://grails.github.io/grails2-doc/2.5.6/ref/Constraints/bindable.html

Properties which are not bindable by default are those related to transient fields, dynamically typed properties and static properties.

如果您真的想让动态类型的 属性 参与批量 属性 绑定,您必须通过以下方式选择加入:

class TestBindCommand {

    String fieldType
    def fieldValue

    static constraints = {
        fieldValue bindable: true
    }
}

也就是说,特别是对于命令对象,没有充分的理由使用动态类型 属性。

希望对您有所帮助。