Объект команды Grails не привязан к типу 'def' - PullRequest
0 голосов
/ 02 апреля 2020

Проблемы при попытке привязать параметр к полю командного объекта, определенному как '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 запрос на отправку параметров в метод 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, он все еще работает ?! Если вы выполните очистку грааля и перезапустите приложение с fieldValue, установленным как def, тогда оно больше не будет работать !? Я отлажен в DataBindingUtils. java, и кажется, что поле не добавляется в белый список, когда оно имеет тип 'def'.

Пример проекта можно найти здесь:

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

Grails версия 2.5.6

1 Ответ

2 голосов
/ 02 апреля 2020

Я отлажен в DataBindingUtils. java и кажется, что поле не добавляется в белый список, когда оно имеет тип 'def'.

Это правильно и по замыслу. По умолчанию динамически типизированные свойства не участвуют в привязке данных массового свойства.

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

Свойства, которые не могут быть привязаны по умолчанию, относятся к переходным полям, динамически типизированным свойствам и свойствам stati c.

Если вы действительно хотите, чтобы динамически типизированное свойство участвовало в связывании массовых свойств, вы должны включить это следующим образом:

class TestBindCommand {

    String fieldType
    def fieldValue

    static constraints = {
        fieldValue bindable: true
    }
}

Тем не менее, для команды В частности, для объектов нет веских причин иметь свойство с динамической типизацией.

Надеюсь, это поможет.

...