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
}
}
也就是说,特别是对于命令对象,没有充分的理由使用动态类型 属性。
希望对您有所帮助。
尝试将参数绑定到定义为 '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
}
}
也就是说,特别是对于命令对象,没有充分的理由使用动态类型 属性。
希望对您有所帮助。