【发布时间】:2019-07-05 09:38:28
【问题描述】:
我正在尝试验证 Spring Boot 中两个字段之一是否不为空?
我已经在主对象的方法类中设置了:
@NotNull(message = "Username field is required")
private String username;
@NotNull(message = "Email field is required")
private String email;
但这需要两个字段都不为空。然后我使用此处描述的自定义验证https://lmonkiewicz.com/programming/get-noticed-2017/spring-boot-rest-request-validation/,但我无法让该示例正常工作。我必须坚持
用户类声明:
@CombinedNotNull(fields = {"username","email"})
public class User implements {
private long id = 0L;
@NotNull(message = "First name field is required")
private String firstName;
@NotNull(message = "Last name field is required")
private String lastName;
private String username;
private String email;
@NotNull(message = "Status field is required")
private String status;
...all methods here...
...setters and getters...
}
CombibnedNotNull 类:
@Documented
@Retention(RUNTIME)
@Target({ TYPE, ANNOTATION_TYPE })
@Constraint(validatedBy = userValidator.class)
public @interface CombinedNotNull {
String message() default "username or email is required";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
userValidator 类:
@Component
public class userValidator implements ConstraintValidator<CombinedNotNull, User> {
@Override
public void initialize(final CombinedNotNull combinedNotNull) {
fields = combinedNotNull.fields();
}
@Override
public boolean isValid(final User user, final ConstraintValidatorContext context) {
final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(user);
for (final String f : fields) {
final Object fieldValue = beanWrapper.getPropertyValue(f);
if (fieldValue == null) {
return false;
}
}
return true;
}
}
还有其他方法可以完成这项工作,还是我应该使用该页面中的“复杂”示例?
【问题讨论】:
-
无论如何看看我的问题和答案stackoverflow.com/questions/46957854/…
-
类验证是最佳方式。您遇到了哪些错误?
-
@LppEdd 我已经用错误更新了 OP。它会抛出
RUNTIME、FIELD、ANNOTATION_TYPE、PARAMETER找不到它们的符号。 -
它们是静态导入。只需使用 ElementType 或 RetentionPolicy 限定它们(例如 ElementType.FIELD - RetentionPolicy.RUNTIME)
-
@LppEdd 好的,继续前进,它出现了我无法将两个字段传递给
ConstraintValidatorContext
标签: java validation spring-boot