es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo acceder a los mensajes predeterminados de las restricciones de validación de Jakarta?

Usando Jakarta Been Validation https://hibernate.org/validator/ para validar código Java, anoto una propiedad de la clase con la anotación predeterminada @NotEmpty.

@Validate
public class A {
..
@NotEmpty
private List<String> myList;
..
}

En una prueba, establezco myList como una lista vacía, valido esa lista y espero la infracción “no debe estar vacío”, que es el mensaje de infracción predeterminado para la anotación estándar @NotEmpty. Lo encontré al imprimirlo, pero también aquí https://github.com/hibernate/hibernate-validator/blob/main/engine/src/main/resources/org/hibernate/validator/ValidationMessages.properties

Set<ConstraintViolation<A>> violations = validator.validate(A);

assertThat(violations).anyMatch(having Message("no debe estar vacío", A.class));

Esto funciona, pero me gustaría reemplazar el mensaje esperado con una referencia a la cadena predeterminada, como jakarta.validation.constraints.Null.message, evitando la duplicación de cadenas. Sin embargo, esto no funciona:

assertThat(violations).anyMatch(having Message(jakarta.validation.constraints.Null.message, A.class));

¿Hay algún experto en validación que pueda mostrarme qué me estoy perdiendo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no soy un experto en validación. Sin embargo, parece que estás tratando de hacer referencia a un mensaje de validación predeterminado utilizando un campo estático del paquete jakarta.validation.constraints. Para hacer referencia a un mensaje predeterminado, puedes usar la interfaz MessageInterpolator proporcionada por Jakarta Bean Validation. Esta interfaz te permite obtener la plantilla de mensaje predeterminada basada en la anotación de restricción y la configuración regional predeterminada.

    Aquí tienes un ejemplo de cómo usar MessageInterpolator para obtener el mensaje predeterminado de la anotación @NotEmpty:

    MessageInterpolator messageInterpolator = validatorContext.getMessageInterpolator();
    String defaultMessage = messageInterpolator.interpolate(
        "{javax.validation.constraints.NotEmpty.message}", 
        new MessageInterpolator.Context() {
            // proporciona información de contexto opcional
        });
    

    Luego, puedes usar la variable defaultMessage en tu afirmación:

    assertThat(violations).anyMatch(having Message(defaultMessage, A.class));
    

    Ten en cuenta que las llaves en la plantilla de mensaje son necesarias para hacer referencia al mensaje predeterminado de una restricción. Además, asegúrate de pasar la información de contexto correcta al objeto MessageInterpolator.Context si es necesario.

    ¡Espero que esto te ayude a resolver tu problema!

Comments are closed.