我们正在从 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)
我可以看到这个约束已经添加到Registry中,如下:
ctx.gormValidatorRegistry.findConstraintFactories(DateOfBirthConstraint)*.properties
我在一个可验证的类中使用了这个约束,如下所示:
class IdentityCO implements Validateable{
Date dateOfBirth
IdentityCO() {}
static constraints = {
dateOfBirth nullable: false, dob: true
}
}