grails 3 gsp с использованием ограничений объекта домена не работает

В grails 2 мы могли ссылаться на ограничения объекта домена в gsp, чтобы сохранить конфигурацию html 5 «сухой». В grails 3 (пробовал как 3.1.10, так и 3.2.0.RC1) я получаю сообщение об ошибке для кода, который я успешно тестировал в grails 2. Я пытаюсь сослаться на совпадения ограничений в атрибуте phone и использовать это для шаблона HTML 5. Для генерации этого кода используются скаффолдинг, но для Grails 3, генерируемый скаффолдингом, используется плагин полей, поэтому я не вижу этот код. Любые идеи?

Вот код объекта домена:

class Disruption {

static constraints = {
    phone(matches:/^[0-9]{10}$/, nullable:true)
    email(email:true, nullable:false)
}

String name
String phone
String email

Вот код gsp:

    <div class="form-group ${hasErrors(bean: disruption, field: 'phone', 'error')}">
    <label for="phone" class="control-label col-sm-3">
        Phone
    </label>
    <div class="col-sm-2">
        <g:textField name="phone" style="width: 7em" class="form-control" title="Phone 10 digits" pattern="${disruption.constraints.phone.matches}" maxlength="10" placeholder="##########" value="${disruption.phone}"/>
    </div>
</div>

Вот исключение:

URI / нарушение / создание Класс java.lang.NullPointerException Сообщение Не удалось обработать запрос; вложенное исключение - org.grails.gsp.GroovyPagesException: ошибка обработки GroovyPageView: [views / disruption / create.gsp: 92] Ошибка выполнения тега: ошибка оценки выражения [disruption.constraints.phone.matches] в строке [58]: невозможно получить свойство phone в нулевом объекте Причина в невозможности получить свойство phone у нулевого объекта


person Joe    schedule 14.09.2016    source источник


Ответы (1)


Объекты домена должны использовать constrainedProperties, а объект Command должен использовать constraintsMap, см. Примеры ниже.

            <g:textField name="phone" style="width: 7em" class="form-control" title="Phone 10 digits" pattern="${disruption.constrainedProperties.phone.matches}" maxlength="10" placeholder="##########" value="${disruption?.phone}"/>

ИЛИ для командных объектов

            <g:textField name="phone" style="width: 7em" class="form-control" title="Phone 10 digits" pattern="${searchCommand.constraintsMap.phone.matches}" maxlength="10" placeholder="##########" value="${searchCommand?.phone}"/>
person Joe    schedule 19.09.2016