代码之家  ›  专栏  ›  技术社区  ›  JackTheKnife

弹簧引导验证-二选一不为空

  •  2
  • JackTheKnife  · 技术社区  · 5 年前

    我正在尝试验证两个字段中是否有一个在Spring引导中不为空?

    我在方法类中为主要对象设置了:

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

    CombinedNotNull类:

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

    用户验证程序类:

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

    有没有其他方法来完成这项工作,或者我应该使用那个页面上的“复杂”示例?

    1 回复  |  直到 5 年前
        1
  •  1
  •   LppEdd    5 年前

    我将尝试为您实现它(即使我没有IDE)。
    里面 ConstraintValidator#initialize 您可以获取配置字段的名称,其中 不能 null .

    @Override
    public void initialize(final CombinedNotNull combinedNotNull) {
        fields = combinedNotNull.fields();
    }
    

    里面 ConstraintValidator#isValid 您可以使用这些字段的名称来检查 Object 领域。

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value);
    
        for (final String f : fields) {
           final Object fieldValue = beanWrapper.getPropertyValue(f);
    
           if (fieldValue == null) {
              return false;
           }
        }
    
        return true;
    }
    

    注释:

    @Retention(RUNTIME)
    @Target({ TYPE, ANNOTATION_TYPE })
    @Constraint(validatedBy = CombinedNotNullValidator.class)
    public @interface CombinedNotNull {
       String message() default "username or email is required";
       Class<?>[] groups() default { };
       Class<? extends Payload>[] payload() default { };
    
       /** Fields to validate against null. */
       String[] fields() default { };
    }
    

    注释可以应用为

    @CombinedNotNull(fields = {
          "fieldName1",
          "fieldName2"
    })
    public class MyClassToValidate { ... }
    

    要了解如何创建类级约束注释,请始终参考官方文档。 Docs