2016-09-15 61 views
4

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

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

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

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

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

有没有出实现这一目标的方式盒,或将我写这一个自定义的验证。

+0

为什么你不抛出异常 – emotionlessbananas

回答

6

自定义的验证注解不应该是一个问题:

@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.trim().isEmpty()); 
    } 

} 

用法?简单:

class QuestionPaper{ 

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

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

+0

这解决了问题。非常感谢优雅的解决方案。 :) –

1

如果只有null或空白空间,这些可能就足够了。

@NotNull, @Valid, @NotEmpty

您可以检查与example。完成一套validations - JSR 303给出一个适合要求的想法。

+0

我已经尝试过了,但这些不是递归应用于列表元素,而是强制执行列表。感谢您的回复。 :) –

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

这也似乎工作,\t \t列表 questionIds = Arrays.asList(“1000”,“”,“”); (!questionIds.contains(空)&& questionIds.contains( “ \t \t如果”)){ \t \t \t的System.out.println( “有效的列表!!!!”); \t \t} else { \t \t \t System.out.println(“Invalid List !!!!”); \t \t}我关心的是如何将它添加到spring验证器中。 –

+0

我不确定Bean Validation是否适用于参考文献 – Journeycorner