Pregunta

Si tiene una clase Java con algunos campos que desea validar usando Hibernate Validator. Ahora quiero que mis usuarios puedan configurar en tiempo de ejecución, que validaciones de tener lugar.

Por ejemplo:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

Digamos que quiero para eliminar la marca NotEmpty o sustituirla por Email o CreditCardNumber, ¿cómo puedo hacerlo? ¿Es posible? Creo que todo se reduce a cambiar anotaciones en tiempo de ejecución ...

¿Fue útil?

Solución

No se puede hacer normalmente.

Esto es lo que he hecho para llegar validaciones más dinámicas de trabajo a través de Hibernate Validator.

  1. Ampliación de la clase ClassValidator.
  2. Reemplazar el método getInvalidVaues(Object myObj). En primer lugar, llamar super.getInvalidValues(myObj), a continuación, añadir el gancho para su validación personalizada.
  3. instancia su validador personalizado y llame getInvalidValues para validar. Cualquier validaciones de hibernación anotada se iniciará a este punto, y sus validaciones dinámicas personalizadas (cualquier cosa no es compatible con anotaciones) se iniciarán también.

Ejemplo:

public class MyObjectValidator extends ClassValidator<MyObject>
{
    public MyObjectValidator()
    {
         super(MyObject.class);
    }

    public InvalidValue[] getInvalidValues(MyObject myObj)
    {
        List<InvalidValue> invalids = new ArrayList<InvalidValue>();
        invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));

        // add custom validations here
        invalids.addAll(validateDynamicStuff(myObj));

        InvalidValue[] results = new InvalidValue[invalids.size()];
        return invalids.toArray(results);
    }

    private List<InvalidValue> validateDynamicStuff(MyObject myObj)
    {
        // ... whatever validations you want ...
    }

}

Así que el código de validación personalizado puede contener lógica como "hacer esta validación, si el usuario ha configurado, de lo contrario hacer que uno", etc Usted puede o puede no ser capaz de aprovechar el mismo código que los poderes de las validaciones de hibernación, pero de cualquier manera, lo que está haciendo es más complicado que el caso 'normal' el uso de validador de hibernación.

Otros consejos

En realidad es posible con el validador de hibernación 4.1. Basta con leer la documentación sobre creación restricción programática .

No creo que usted será capaz de eliminar o cambiar la anotación, que es parte de la definición de clase. Se puede construir una nueva clase, que es posible en tiempo de ejecución, pero un poco involucrados. Hibernación puede apoyar el acceso mediante programación a las validaciones y le permiten anular la anotación, no sé la API que también. Hibernate hace un poco de tiempo de ejecución propio edificio de clase ... que podría ser un buen lugar para aprender cómo hacerlo si está interesado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top