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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Grails 3.3.10中使用自定义约束?相关的知识,希望对你有一定的参考价值。

我们正在从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
    

答案

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

以上是关于如何在Grails 3.3.10中使用自定义约束?的主要内容,如果未能解决你的问题,请参考以下文章

Grails:将自定义约束应用于域类的所有字段

Grails 使用 Spring Security Core Plugin 测试用户角色自定义验证约束

Grails - 从自定义验证器闭包调用内置约束

自定义错误消息的 Grails 问题

如何在Grails中使用自定义身份验证过滤器?

Grails spring security如何在自定义身份验证中记住我?