文字列のリストを持つモデルクラスがあります。リストは空にすることも、要素を含めることもできます。要素がある場合、それらの要素を空にすることはできません。例として、それぞれが文字列であるquestionIdのリストを持つQuestionPaperというクラスがあるとします。
class QuestionPaper{
private List<String> questionIds;
....
}
論文には0個以上の質問があります。ただし、質問がある場合、id値を空の文字列にすることはできません。 SpringBoot、Hibernate、JPA、Javaを使用してマイクロサービスを作成しています。この検証を行うにはどうすればよいですか。どんな助けでもありがたいです。
例として、ユーザーからの次のjson入力を拒否する必要があります。
{ "examId": 1, "questionIds": [ "", " ", "10103" ] }
これを達成するためのすぐに使える方法はありますか、またはこれのためのカスタムバリデーターを作成する必要がありますか?.
カスタム検証アノテーションは問題になりません:
@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
}
追伸ロジックをテストしませんでしたが、それは良いことだと思います。
!CollectionUtils.isEmpty(questionIds)
&& !questionIds.stream.anyMatch(StringUtils::isEmpty())
これを使用すると簡単に対処できます
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ではなく、空でないことが確認されます。