¿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?
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 interfazMessageInterpolator
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
:Luego, puedes usar la variable
defaultMessage
en tu afirmación: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!