gpt4 book ai didi

java - hibernate validator 中的 TYPE_USE 注释

转载 作者:行者123 更新时间:2023-11-30 08:32:47 25 4
gpt4 key购买 nike

我知道 hibernate validator 支持 TYPE_USE 注释:虽然它没有定义自己的注释,但它允许您定义和使用自定义注释。

我可以正确地定义和验证这样的注释(很快就会编写代码),但是我想将错误映射到用于向用户显示错误的路径中。

给定以下样本

public class SampleTest {

private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

public static class LimitedSizeStringValidator implements ConstraintValidator<LimitedSize, String> {

private LimitedSize constraint;

@Override
public void initialize(LimitedSize constraintAnnotation) {
this.constraint = constraintAnnotation;
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
String s = Ensure.notNull(value);
return s.length() >= constraint.min() &&
s.length() <= constraint.max();
}
}

@Retention(RUNTIME)
@Documented
@Target({TYPE_USE})
@Constraint(validatedBy = {LimitedSizeStringValidator.class})
public @interface LimitedSize {

String message() default "{javax.validation.constraints.Size.message}";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

int min() default 0;

int max() default Integer.MAX_VALUE;
}

private static class TestBean {
@Valid
private Collection<@LimitedSize(max = 3) String> strings = new ArrayList<>();

@Valid
private Collection<InnerBean> beans = new ArrayList<>();
}

private static class InnerBean {
@Min(3)
private final int value;

private InnerBean(int value) {
this.value = value;
}
}

@Test
public void testBeanInvalid() {

TestBean testBean = new TestBean();

assertThat(validator.validate(testBean)).isEmpty();

testBean.strings.add("ok");
testBean.strings.add("ok2");
testBean.beans.add(new InnerBean(4));
assertThat(validator.validate(testBean)).isEmpty();

testBean.strings.add("not_ok");
testBean.beans.add(new InnerBean(2));

Set<ConstraintViolation<TestBean>> violations = validator.validate(testBean);
assertThat(violations).hasSize(2);

StreamSupport.stream(violations.spliterator(), false)
.forEach(v -> {
System.out.println(v.getPropertyPath());
System.out.println(v.getMessage());
v.getPropertyPath().forEach(p -> System.out.print("'" + p.getName() + (p.getIndex() != null ? "[" + p.getIndex() + "]" : "") + "' -> "));
System.out.println();
});
}
}

我想将错误映射到一个对象中

errors: [
["beans", "1", "value"],
["strings", "2"]
]

在我的示例中,我目前的方法是导航违规路径 ( http://docs.oracle.com/javaee/7/api/javax/validation/ConstraintViolation.html#getPropertyPath-- ),这对于第一种情况非常有效,但对于第二种情况却失败了(我找不到检索失败索引的方法目的)。我认为原因在于 javax.validation.Path.PropertyNode 的实现在 hibernate-validator 中(我目前使用的是 5.2.4.Final 版本,代码看起来与链接的 5.2.1.Final 中的代码相同。供引用:

@Override
public final Integer getIndex() {
if ( parent == null ) {
return null;
}
else {
return parent.index;
}
}

在我看来,使用 TYPE_USE 这种方法是行不通的,因为失败的对象是叶子,因此没有子节点可以从中检索索引。

很好,javax.validation.Path 的 hibernate 实现覆盖了 toString 方法,这样 violation.getPropertyPath().toString()beans[1].valuestrings[2](在上面的示例代码中)。

因此,对于问题:我的导航方法是否错误,还有另一种方法可以从 ConstraintViolation 中提取此类映射?或者这是对 hibernate 开发人员的功能请求(我可以看到在 TYPE_USE 注释之前,他们实现的 getIndex 方法完全没问题?

感觉很奇怪我是第一个遇到这个问题的人(我尝试用谷歌搜索但找不到任何相关的东西,最接近的是:https://github.com/hibernate/hibernate-validator/pull/441)所以我想知道这个错误是不是我的而不是 hibernate 限制

最佳答案

我同意应该为该值设置索引,并且认为您在 Hibernate Validator 中发现了一个问题。你能在我们的 JIRA tracker 中打开一个问题吗? ?

顺便说一句。 TYPE_USE 级别约束的概念将在 Bean Validation 2.0 中标准化。所以在这个领域可能会有更多的变化,特别是我想知道那个节点应该有什么Kind(目前它是PROPERTY,这似乎有问题)。

关于java - hibernate validator 中的 TYPE_USE 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39872625/

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