Estoy tratando de usar la validación JSR-303 y mostrar sus resultados en la página jsp . Aquí hay una pieza de código de página jsp que muestra un error:
<c:set var="Error"> <form:errors path="name"/> </c:set> ... <spring:transform value="${Error}"/>En el controlador tengo lo siguiente:
@PostMapping(params = "next") public String next(@Valid @ModelAttribute(COMMAND_NAME) final ProjectNewDetailsCommand cmd, final Errors errors, final Model model, final HttpServletRequest request) { Primero, la solución que funcionó para mí es escribir una clase de Validator personalizada:
@Override public void validate(Object o, Errors errors) { errors.pushNestedPath("project"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "error.project.creation.name.required"); errors.popNestedPath(); } En este caso, se aplicó el messages.properties apropiado de message.properties y se muestra en la interfaz de usuario:
error.project.creation.name.required=The name must not be blank. Aquí hay otro caso cuando uso la anotación JSR-303 :
public class Project { ... @Size(max = 100, message = "error.project.creation.size") private String name; En message.properties hay un messages.properties bajo la clave error.project.creation.size , también intenté agregar el mensaje con la clave Size.command.project.name como se indica en algunas de las fuentes. El objeto de Error en el controlador tampoco está vacío y contiene errores de validación. Pero cuando uso este enfoque con JSR-303 , aparece el siguiente error:
Caused by: javax.servlet.jsp.JspTagException: No message found under code 'Size' for locale 'en_US'. at org.springframework.web.servlet.tags.MessageTag.doEndTag(MessageTag.java:200) Lo que significa que, por alguna razón Spring intenta aplicar el código de error Size en lugar de error.project.creation.size o Size.command.project.name . ¿Alguna idea de por qué sucede esto y cómo solucionarlo?
Finalmente pude encontrar el origen del problema. En el código para generar alertas, había una etiqueta spring:message :
<spring:message code="${error.code}" arguments="${error.arguments}"/> Si funciona de la siguiente manera: busca el último código de la matriz de codes en la clase de Errors (consulte el método DefaultMessageSourceResolvable.getCode ) y es por eso que no pudo encontrar el mensaje Size y no recogió el defaultMessage creado por el validador de hibernación o el personalizado. una.
La solución simple en este caso fue agregar un atributo de text :
<spring:message code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/>