弹簧验证非空元素的字符串列表

我有一个模型类,它有字符串列表。该列表可以是空的,也可以包含元素。如果它有元素,则这些元素不能为空。举个例子,假设我有一个名为QuestionPaper的类,它有一个 questionId 列表,每个列表都是一个字符串。

class QuestionPaper{
private List<String> questionIds;
....
}

论文可以有零个或多个问题。但是,如果它有疑问,则id值不能为空字符串。我正在使用SpringBoot,Hibernate,JPA和Java编写微服务。如何进行此验证。任何帮助是值得赞赏的。

例如,我们需要拒绝来自用户的以下 json 输入。

{ "examId": 1, "questionIds": [ "", " ", "10103" ] }

是否有任何开箱即用的方法来实现这一点,或者我是否必须为此编写一个自定义验证程序。


答案 1

自定义验证批注应该不是问题:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NotEmptyFieldsValidator.class)
public @interface NotEmptyFields {

    String message() default "List cannot contain empty fields";

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

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

}


public class NotEmptyFieldsValidator implements ConstraintValidator<NotEmptyFields, List<String>> {

    @Override
    public void initialize(NotEmptyFields notEmptyFields) {
    }

    @Override
    public boolean isValid(List<String> objects, ConstraintValidatorContext context) {
        return objects.stream().allMatch(nef -> nef != null && !nef.trim().isEmpty());
    }

}

用法?简单:

class QuestionPaper{

    @NotEmptyFields
    private List<String> questionIds;
    // getters and setters
}

P.S.没有测试逻辑,但我想这很好。


答案 2

我只是有类似的案例要解决

class QuestionPaper {

    @NotEmpty
    private List<@NotBlank String> questionIds;

    // getters and setters
}

推荐