如何在Spring验证器中拒绝List中的无效值?

时间:2018-11-15 12:36:33

标签: java spring validation

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

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

我需要在org.springframework.validation.Validator中验证这些ID。

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

问题

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

2 个答案:

答案 0 :(得分:-1)

Validator界面:

@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 {};
}

ValidatorImplementation:

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<>();

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

答案 1 :(得分:-1)

您可以将 reject()和/或 rejectValue()与字段/错误代码/ defaultMessage或自定义验证器一起使用来拒绝值。 / p>