gpt4 book ai didi

Javax 验证 : Constraint Violations for Map

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:29 24 4
gpt4 key购买 nike

我将 Map 用于本地化值,将语言环境作为键,将字符串作为值。对于必填字段,我需要检查是否至少设置了必需的语言环境 - 或者至少设置了一些值。我已经实现了要在此类 Map 字段和相应的 validator 上使用的验证注释。问题是,如何报告缺失值? UI 中用于绑定(bind)字段错误/值的属性路径,每次都出错:

// Domain object:
@LocalizationRequired
private Map<Locale, String> field;


// LocalizationRequiredValidator:
public boolean isValid(Map<Locale, String> map, ConstraintValidatorContext context) {
if (requiredLocales.isEmpty()) {
// Check that there exists any not null value
} else {
context.disableDefaultConstraintViolation();
boolean valid = true;
for (Locale requiredLocale : requiredLocales) {
if (map.get(requiredLocale) == null) { // e.g. fi
valid = false;
context.buildConstraintViolationWithTemplate("LocalizationRequired")
// These end up in wrong property path:
// .addNode(requiredLocale)
// --> field.fi
// .addNode("[" + requiredLocale + "]")
// --> field.[fi]
// .addNode(null).addNode(requiredLocale).inIterable()
// --> field.fi
// .addNode(null).addNode(null).inIterable().atKey(requiredLocale)
// --> field
.addConstraintViolation();
}
}
return valid;
}
}

此错误的正确路径是“field[fi]”,但看来我只能访问索引子属性。在这种情况下,对象本身被索引。我正在使用 Hibernate Validator。

最佳答案

我无法找到一种方法来报告元素级索引字段的错误。 - 规范中是否忽略了这一点?

这是我做的:

我没有使用 Map,而是使用了一个“可嵌入”bean,其中包含所有受支持语言环境的实际字段(例如 LocalizedString(String fi, String en, etc))。然后报告如下违规情况:

context.buildConstraintViolationWithTemplate("LocalizationRequired")
.addNode(requiredLocale)
.addConstraintViolation();

这在我们的案例中是可行的,因为我们有一组预定义的支持语言,但它不会扩展到具有任意索引的索引字段。

此外,Spring 的 LocalValidatorFactoryBean 或 Hibernate Validator 无法正确支持可嵌入物的验证。由于同一组件在具有不同验证要求的不同地方使用,我不能将 @Valid 与组件本身内的实际验证注释一起使用 - 至少在 @Valid< 上不支持验证组时不能使用.

Spring 的 LocalValidatorFactoryBean 或 Hibernate Validator 的问题在于 ConstraintViolationinvalidValue 是 LocalizedString ("field") 而不是值报告的错误嵌套字段(“field.fi”)。幸运的是,这可以通过覆盖 LocalValidatorFactoryBean.processConstraintViolations 来解决,方法是删除“具有来自 ConstraintViolation 的无效值的自定义 FieldError 注册”并简单地报告错误

errors.rejectValue(field, errorCode, errorArgs, violation.getMessage());

这样 Spring 使用给定的 field 解析 invalidValue

关于Javax 验证 : Constraint Violations for Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11685477/

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