2016-09-15 62 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