gpt4 book ai didi

java - 仅验证表单字段上的一个 Spring 注释,并且独立于其他字段

转载 作者:行者123 更新时间:2023-12-01 14:32:47 25 4
gpt4 key购买 nike

我有一个特定的要求,即使它看起来非常简单。

我有一个用户表单(给您一个简化版本)。

public class Form{
@NotEmpty(message = "{empty}")
@Size(min = 3, max = 32, message = "{size}")
private String firstName;
@NotEmpty(message = "{empty}")
@Size(min = 3, max = 32, message = "{size}")
private String lastName;
}

我希望两个字段独立验证,在第一个错误时失败(然后只显示一条错误消息)。

例如,如果我发送firstName=""和lastName="aa",我想获得firstName的空消息和lastName的大小消息。

但是通过这样做,我收到了 2 条关于名字的错误消息(大小和空)。

我发现的第一个替代方案是使用@groupsequences,但仍然无法独立验证字段。

所以我创建了一个新的注释:

@Documented
@Constraint(validatedBy = {})
@Retention(RetentionPolicy.RUNTIME)
@NotEmpty(message = "{empty}", groups = Check.firstTry.class)
@Size(min = 5, max = 32, message = "{size}", groups = Check.secondTry.class)
@GroupSequence({ Check.firstTry.class, Check.secondTry.class, Name.class })
public @interface Name {
public abstract String message() default "{empty}";

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

public abstract Class<?>[] payload() default {};
}

但它仍然验证每条消息。

如果我使用@ReportAsSingleViolation,它将始终返回默认消息。

我是否错过了什么地方,对于这种情况,表单验证应该很容易,这不是一个奇怪的情况,不是吗?

谢谢

最佳答案

编写一个自定义 ConstraintValidator,逐一检查约束并报告它找到的第一个约束。这样做的(相当大的)缺点是您最终会重新实现每个组件注释的检查机制,但您确实可以完全控制错误消息。

public class MyConstraintValidator implements ConstraintValidator<Name, String> {

private Name annotation;

@Override
public void initialize(MyConstraintAnnotation annotation) {
this.annotation = annotation;
}

@Override
public boolean isValid(String name, ConstraintValidatorContext context) {
if (name == null) {
context.buildConstraintViolationWithTemplate(emptyMessage).addConstraintViolation();
return false;
} else if (name.length() < getMinSize(annotation)) {
context.buildConstraintViolationWithTemplate(tooShortMessage).addConstraintViolation();
return false;
} else if (name.length > getMaxSize(annotation)) {
context.buildConstraintViolationWithTemplate(tooLongMessage).addConstraintViolation();
return false;
} else {
return true;
}
}
}

也许您可以获取 ConstraintValidatorFactory 的句柄并获取每个组合注释所需的 ConstraintValidators?尽管这会让您了解实现的内部原理。这根本不是一个完美的答案,但它会得到你所需要的。

关于java - 仅验证表单字段上的一个 Spring 注释,并且独立于其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16730574/

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