web-dev-qa-db-ja.com

空でない要素のSpring Validate List of Strings

文字列のリストを持つモデルクラスがあります。リストは空にすることも、要素を含めることもできます。要素がある場合、それらの要素を空にすることはできません。例として、それぞれが文字列であるquestionIdのリストを持つQuestionPaperというクラスがあるとします。

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

論文には0個以上の質問があります。ただし、質問がある場合、id値を空の文字列にすることはできません。 SpringBoot、Hibernate、JPA、Javaを使用してマイクロサービスを作成しています。この検証を行うにはどうすればよいですか。どんな助けでもありがたいです。

例として、ユーザーからの次のjson入力を拒否する必要があります。

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

これを達成するためのすぐに使える方法はありますか、またはこれのためのカスタムバリデーターを作成する必要がありますか?.

8

カスタム検証アノテーションは問題になりません:

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

追伸ロジックをテストしませんでしたが、それは良いことだと思います。

18
Branislav Lazic

ヌルまたは空のスペースのみの場合は、これらで十分です。

@NotNull, @Valid, @NotEmpty

example で確認できます。 検証-JSR 3 の完全なセットは、要件に合ったアイデアを提供します。

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

これを使用すると簡単に対処できます

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
    }

これにより、nullではなく、空でないことが確認されます。

0
Shweta Shaw