首页 > 解决方案 > 如何在 Spring 验证器中拒绝 List 中的无效值?

问题描述

我收到从JSON客户端请求正文反序列化的域对象 ID 列表:

@JsonProperty("workgroups")
private List<WorkgroupId> workgroupIds = new ArrayList<>();

我需要在org.springframework.validation.Validator.

for (WorkgroupId workgroupId : project.getWorkgroupIds()) {
  if (!domainObjectTools.doesWorkgroupExist(workgroupId)) {
// reject this invalid value here...
  }
}

问题

如何拒绝无效值org.springframework.validation.Errors

标签: javaspringvalidation

解决方案


验证器接口:

@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { CustomValidatorValidator.class })
@Documented
public @interface CustomValidator{
    String message() default "Put here your default message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

验证器实现:

public final class CustomValidatorValidator implements ConstraintValidator<CustomValidator, List<WorkgroupId>> {

    @Override
    public void initialize(CustomValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<WorkgroupId> yourlist, ConstraintValidatorContext context) {
        if (yourlist== null)
            return true;
        else
            return yourlist.stream().anyMatch(s -> /* filter here as you want */);
    }
}

请注意,如果字段为空,我们将返回true,我这样做是因为@NotNull如果我不需要为空,我只是放置约束,因此我可以更好地控制约束。

最后:

@JsonProperty("workgroups")
@CustomValidator
private List<WorkgroupId> workgroupIds = new ArrayList<>();

PS:我不明白你为什么在最后一个代码中初始化列表。如果这是您应该通过请求接收的字段,那么您不需要初始化它,json 反序列化器将使用 json 中的传入字段对其进行初始化。


推荐阅读