validación de la primavera de arranque - uno de dos no nula

JackTheKnife:

Estoy tratando de validar si uno de los dos campos no son nulos en la primavera de arranque?

Me he puesto que en la clase de método para el objeto principal:

@NotNull(message = "Username field is required")
private String username;

@NotNull(message = "Email field is required")
private String email;

pero eso requerirá tener ambos campos no nulos. Luego fui con validación personalizada que se describen aquí https://lmonkiewicz.com/programming/get-noticed-2017/spring-boot-rest-request-validation/ pero no era capaz de conseguir que el ejemplo de trabajo. Tengo que en atascado

declaración de la clase de usuario:

@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 clase:

@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 clase:

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

¿Hay alguna otra manera de hacer esto o debería ir con el ejemplo "complejo" de esa página?

LppEdd:

Voy a tratar de ponerlo en práctica para usted (incluso si estoy sin un IDE).
En el interior ConstraintValidator#initializese puede conseguir un asimiento de los nombres de los campos configurados, que no puede ser null.

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

En el interior ConstraintValidator#isValidse puede utilizar nombres de los campos para comprobar los Objectcampos.

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

Anotación:

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

La anotación podría aplicarse como

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

Para aprender a crear una restricción de anotación de nivel de clase, conocer y utilizar la documentación oficial. Documentos

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=181336&siteId=1
Recomendado
Clasificación