我所拥有的结构如下所示:
Class A{
String str;
int i;
List<B> bs;
C c;
@NotNull
List<D> ds;
}
Class B{
@NotNull
List<E> es;
}
Class C{
List<String> s;
}
Class E{
@NotNull
List<String> s;
}
对于使用@NotNull注释的列表变量,如果其中任何变量具有一个或多个空对象,则需要抛出验证错误。而对于其他列表变量,我只需要删除空值; 实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
您应该定义用于验证的自定义注释。
所以定义像bellow一样的自定义注释。
@Target({ElementType.FIELD, ElementType.PARAMETER,ElementType.ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidateListValidator.class)
@Documented
public @interface ValidateList {
}
并像这样实施ValidateListValidator
:
public class ValidateListValidator implements ConstraintValidator<ValidateList, List<Object>> {
private ValidateList validateList;
@Override
public void initialize(ValidateList validateList) {
this.validateList = validateList;
}
@Override
public boolean isValid( List<Object> list, ConstraintValidatorContext constraintValidatorContext) {
return list.stream().noneMatch(Objects::isNull);
}
}
并进行测试
@Test
public void test() {
boolean valid = validator.isValid(Arrays.asList("test","this",null),context);
assertThat(valid, is(false));
}
答案 1 :(得分:0)
如果您使用的是验证2.0+,则可以在其中添加注释:List<@NotNull String> s;
答案 2 :(得分:0)
这是我写的最终代码,只是对Hadi发布的代码进行了一些调整。我希望它有所帮助: 的注释:强>
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ListValidator.class)
@Documented
public @interface ValidList {
String message() default "Null values are not allowed in array fields.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证员类:
import java.util.List;
import java.util.Objects;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class ListValidator implements ConstraintValidator<ValidList, List<? extends Object>> {
@Override
public boolean isValid(List<? extends Object> list, ConstraintValidatorContext context) {
return list.stream().noneMatch(Objects::isNull);
}
@Override
public void initialize(ValidList constraintAnnotation) {}
}