Пользовательское ограничение 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)