Пользовательское ограничение Grails не работает

Я пытался создать пользовательское ограничение в проекте Grails (см. Код ограничения ниже).

import org.codehaus.groovy.grails.validation.AbstractConstraint
import org.springframework.validation.Errors

class BuscaConstraint extends AbstractConstraint {

    public static final String CONSTRAINT_NAME = "busca"

    protected void processValidate(Object target, Object propertyValue, Errors errors) {
    }

    boolean supports(Class type) {
      return type && String.class.isAssignableFrom(type);
    }

    String getName() {
      return CONSTRAINT_NAME;
    }
}

Как видите, это ограничение на самом деле ничего не проверяет. Вместо этого это просто флаг для настройки рендеринга свойства в генерации скаффолдинга. Создав класс выше, я добавил следующую строку в файл Config.groovy:

ConstrainedProperty.registerNewConstraint(BuscaConstraint.CONSTRAINT_NAME, BuscaConstraint.class)

..и добавил это ограничение к свойству класса:

class ThatClass {
  def someProperty
  static constraints = { someProperty (unique:true, busca: "nome") 
}

Однако, если я попытаюсь получить результат выражения ThatClass.constraints.someVariable.getAppliedConstraint("busca")все, что я получаю, это null,

Я основывал свой подход на некоторых постах блога, таких как этот, и на ограничениях в репозитории Grails github(однако я не вижу, как они там настроены).

Что я делаю неправильно? Изменилась ли конфигурация пользовательских ограничений Grails за последнее время?

2 ответа

Похоже, ваше ограничение хорошо. Я использую нечто очень похожее в своем плагине Url Without Scheme Validator, в классе UrlWithoutSchemeConstraint, и это работает как прелесть в последних версиях Grails (2.3.x, 2.4.x).

Однако я никогда не пытался получить к нему доступ во время выполнения, поэтому я попытаюсь исследовать эту область. Например, вы пробовали ThatClass.constraints.someProperty.busca?

Я также использую свое ограничение в качестве тега в проекте Grails 2.4.4. Доступ к ограничению можно получить с помощью следующего кода:

domainClass.constraints[p.name].getMetaConstraintValue("encodeAsRaw")

Где p.name - это имя свойства, а "encodeAsRaw" - это имя моего ограничения. Я успешно использую этот код в паре файлов.gsp.

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

Для полноты вот мое определение ограничения в классе моего домена:

myProperty(nullable:true, blank:true, unique:false, maxSize:1000, encodeAsRaw:true)
Другие вопросы по тегам