Grails привязывает данные к не-предметному классу с проверкой типа

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

Было бы неплохо потом иметь значения в удобном контейнере. Поэтому я попытался передать params конструктору контейнера и bindData объекту-контейнеру. Ни то, ни другое не удается:

class ContainerClass {
     Integer foo = 42;
}

class TestController {

    def index(){
         //doesn't throw, **even when params.foo = "2asdf3"**
         ContainerClass meh = new ContainerClass();
         bindData(meh, params);

         println meh.foo //prints 42 when params.foo = "2asdf3"

         // throws GroovyCastException: Cannot cast object '23' with class
         // 'java.lang.String' to to class 'java.lang.Integer',
         // **even when params.foo = "23"**
         ContainerClass meh2 = new ContainerClass(params);
         render "meh"
    }
}

Я использую Grails 3, если это важно.


person t.animal    schedule 05.06.2016    source источник


Ответы (1)


Вы можете использовать объекты команд для привязки параметров к определенному типу данных. Ссылка: http://docs.grails.org/latest/guide/single.html?utm_content=bufferf77f5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#commandObjects

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

person Manali Khanna    schedule 06.06.2016
comment
Также могут возникать исключения - от простого валидатора ограничений до конкретного grails.databinding.converters.ValueConverter. См. Часть документации по привязке данных, чтобы узнать, как это сделать. - person droggo; 06.06.2016
comment
Что ж, сейчас я не могу отказаться от этого ответа, и это почти то, что мне нужно, так что ничего страшного. Но есть некоторые предостережения: 1) Значения по умолчанию невозможны. Если свойство отсутствует, hasErrors вернет true, даже если для него установлено значение по умолчанию 2) При отправке данных через JSON кажется, что инициализируется только первый из нескольких CommandObject. Второй предположительно видит только пустой JSONObject и терпит неудачу. - person t.animal; 06.06.2016
comment
Не могли бы вы подробнее остановиться на 2-м пункте? Приведите пример? Для пункта 1 вы можете переопределить геттер и соответствующим образом изменить. - person Manali Khanna; 07.06.2016
comment
Для 2): Допустим, у меня есть два объекта Command Foo и Bar. В действии я могу передать их оба: myAction(Foo foo, Bar bar){...} (по крайней мере, так сказано в документе). При передаче JSON в действие foo будет инициализировано, bar - нет. - person t.animal; 10.06.2016