如何在Grails 3.3.10中使用自定义约束?

问题描述 投票:2回答:1

我们正在从Grails 2.5.4迁移到Grails 3.3.10。在众多障碍中,一个是我们的注册自定义内容不再起作用。通过一些研究,我们发现Grails 3.3.10中有一种新方法可以声明和注册这些约束。

即使执行了这些步骤,似乎这些约束也被简单地忽略了。我在这里想念什么吗?

自定义约束类:

    package com.simpleinteract.constraints

import com.simpleinteract.utils.SimpleInteractDateUtils
import org.grails.datastore.gorm.validation.constraints.AbstractConstraint
import org.springframework.context.MessageSource
import org.springframework.validation.Errors

class DateOfBirthConstraint extends AbstractConstraint {

    static final String CONSTRAINT_NAME = "dob"
    static final IntRange YEAR_RANGE = (1890..(SimpleInteractDateUtils.currentYear))
    static final String DEFAULT_CODE = "invalid"
    static final String DEFAULT_MESSAGE_CODE = "default.dateOfBirth.invalid.message"

    private final boolean dob;

    public DateOfBirthConstraint(Class<?> constraintOwningClass, String constraintPropertyName, Object constraintParameter, MessageSource messageSource) {
        super(constraintOwningClass, constraintPropertyName, constraintParameter, messageSource);
        this.dob = (boolean) this.constraintParameter;
    }

    /* (non-Javadoc)
     * @see org.grails.validation.Constraint#supports(java.lang.Class)
     */
    @SuppressWarnings("rawtypes")
    public boolean supports(Class type) {
        return type != null && String.class.isAssignableFrom(type);
    }

    @Override
    protected Object validateParameter(Object constraintParameter) {
        if (!(constraintParameter instanceof Boolean)) {
            throw new IllegalArgumentException("Parameter for constraint [" +
                    dob + "] of property [" +
                    constraintPropertyName + "] of class [" + constraintOwningClass +
                    "] must be a boolean value");
        }

        return constraintParameter;
    }


    public String getName() {
        return CONSTRAINT_NAME;
    }

    @Override
    protected void processValidate(Object target, Object propertyValue, Errors errors) {
        if (!dob) {
            return;
        }

        Object[] args = [constraintPropertyName, constraintOwningClass, propertyValue]

        if (isValid(propertyValue)) {
            rejectValue(target, errors, DEFAULT_MESSAGE_CODE,
                    CONSTRAINT_NAME + DEFAULT_CODE, args);
        }
    }

    protected void isValid(propertyValue) {
        !(propertyValue && propertyValue instanceof Date && (!YEAR_RANGE?.contains(SimpleInteractDateUtils.getYear(propertyValue)) || propertyValue >= new Date()?.clearTime()))
    }

}

我正在如下所示在Bootstrap.groovy的init块中注册此约束:

    ValidatorRegistry gormValidatorRegistry
    gormValidatorRegistry.addConstraint(DateOfBirthConstraint)

我看到此约束已添加到注册表中,如下所示:

ctx.gormValidatorRegistry.findConstraintFactories(DateOfBirthConstraint)*.properties

我在可验证的类中使用了以下约束:

class IdentityCO implements Validateable{
    Date dateOfBirth

    IdentityCO() {}

    static constraints = {
        dateOfBirth nullable: false, dob: true
    }
}
validation grails gorm customvalidator grails-3.3
1个回答
0
投票

我有同样的问题-这是一个错误吗?

© www.soinside.com 2019 - 2024. All rights reserved.