gpt4 book ai didi

hibernate - 构建动态 ConstraintViolation 错误消息

转载 作者:行者123 更新时间:2023-12-02 23:17:46 24 4
gpt4 key购买 nike

我编写了一个由自定义 ConstraintValidator 实现的验证注释。我还想生成非常具体的 ConstraintViolation 对象,这些对象使用在消息插值期间的验证过程中计算的值。

public class CustomValidator 
implements ConstraintValidator<CustomAnnotation, ValidatedType> {

...
@Override
public boolean isValid(ValidatedType value, ConstraintValidatorContext context) {
// Figure out that the value is not valid.
// Now, I want to add a violation whose error message requires arguments.
}
}

我的消息源中的假设错误消息:

CustomAnnotation.notValid = The supplied value {value} was not valid because {reason}.

传递到 isValid 方法的上下文提供了一个用于构建约束违规的接口(interface),并最终将其添加到上下文中。但是,我似乎不知道如何使用它。据此documention对于我正在使用的版本,我可以将 bean 和属性节点添加到违规中。这些是我可以为违规定义指定的唯一附加详细信息,但我不明白它们如何映射到错误消息中的参数。

百万美元问题:如何使用自定义 validator 将动态参数传递给我的验证错误消息?我想填写这些 {value}{reason} 字段使用 ConstraintValidatorContext 的接口(interface)来构建违规行为。

获取消息源的实例并在自定义 validator 中插入消息不是一种选择 - 无论如何,验证出来的消息都会被插入,并且内部插入将导致某些消息被插入两次,可能会消灭转义的消息单引号或其他在我的消息定义文件中具有特殊含义的字符。

最佳答案

这对于标准化的 Bean Valiation API 来说是不可能的,但 Hibernate Validator(BV 引用实现)中有一种方法。

您需要将 ConstraintValidatorContext 解包到 HibernateConstraintValidatorContext 中,这样您就可以访问 addExpressionVariable() 方法:

public class MyFutureValidator implements ConstraintValidator<Future, Date> {

public void initialize(Future constraintAnnotation) {}

public boolean isValid(Date value, ConstraintValidatorContext context) {
Date now = GregorianCalendar.getInstance().getTime();

if ( value.before( now ) ) {
HibernateConstraintValidatorContext hibernateContext =
context.unwrap( HibernateConstraintValidatorContext.class );

hibernateContext.disableDefaultConstraintViolation();
hibernateContext.addExpressionVariable( "now", now )
.buildConstraintViolationWithTemplate( "Must be after ${now}" )
.addConstraintViolation();

return false;
}

return true;
}
}

引用指南有一些more details .

关于hibernate - 构建动态 ConstraintViolation 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23702975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com