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

时间:2016-09-15 06:15:41

标签: java spring validation spring-validator

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

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

该论文可以有零个或多个问题。但如果有问题,则id值不能为空字符串。我正在使用SpringBoot,Hibernate,JPA和Java编写一个微服务。我该怎么做这个验证。任何帮助表示赞赏。

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

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

是否有任何开箱即用的方法可以达到此目的,或者我是否必须为此编写自定义验证器。

5 个答案:

答案 0 :(得分:15)

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

@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。没有测试逻辑,但我觉得它很好。

答案 1 :(得分:1)

如果只是在空或空格上,这些可能就足够了。

@NotNull, @Valid, @NotEmpty

您可以查看example。完整的validations - JSR 303提供符合​​要求的想法。

答案 2 :(得分:1)

!CollectionUtils.isEmpty(questionIds) 
   && !questionIds.stream.anyMatch(StringUtils::isEmpty())

答案 3 :(得分:0)

使用

可以轻松解决此问题
import org.apache.commons.collections.CollectionUtils;

    QuestionPaper question = new QuestionPaper();
    question.setQuestionIds(Arrays.asList("", " ", "10103"));

   if(CollectionUtils.isNotEmpty(question.getQuestionIds())) {
        // proceed
    } else {
        //throw exception or return
    }

这将检查非空和非空。

答案 4 :(得分:0)

我刚刚有类似的案例要解决

class QuestionPaper {

    @NotEmpty
    private List<@NotBlank String> questionIds;

    // getters and setters
}