2017-03-29 3 views
3

Ich versuche JSR-303 Validierung zu verwenden und seine Ergebnisse in jsp Seite anzuzeigen. Hier ist jsp Seitencode Stück, das zeigt Fehler:Spring JSR-303 mit Formular: Fehler Tag

<c:set var="Error"> 
    <form:errors path="name"/> 
</c:set> 
... 
<spring:transform value="${Error}"/> 

In der Steuerung Ich habe folgende:

@PostMapping(params = "next") 
public String next(@Valid @ModelAttribute(COMMAND_NAME) final ProjectNewDetailsCommand cmd, 
        final Errors errors, 
        final Model model, 
        final HttpServletRequest request) { 

Zunächst wird die Lösung, die für mich gearbeitet wird eine benutzerdefinierte Validator Klasse zu schreiben:

@Override 
public void validate(Object o, Errors errors) { 
    errors.pushNestedPath("project"); 
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "error.project.creation.name.required"); 
    errors.popNestedPath(); 
} 

In diesem Fall wurde die entsprechende Nachricht von messages.properties angewendet und auf UI:

angezeigt
error.project.creation.name.required=The name must not be blank. 

Hier ist ein weiterer Fall, wenn ich JSR-303 Anmerkung:

public class Project { 

    ... 
    @Size(max = 100, message = "error.project.creation.size") 
    private String name; 

In messages.properties dort die Nachricht unter Schlüssel error.project.creation.size ist, habe ich auch die Nachricht mit Schlüssel Size.command.project.name hinzuzufügen versucht, wie es in einigen angegeben ist der Quellen. Error Objekt im Controller ist auch nicht leer und enthält Validierungsfehler. Aber wenn ich diesen Ansatz mit JSR-303 verwenden bekam ich folgende Fehlermeldung:

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) 

Was bedeutet, dass aus irgendeinem Grund Spring versucht Size Fehlercode anzuwenden statt error.project.creation.size oder Size.command.project.name. Irgendwelche Ideen, warum das passiert und wie das zu beheben?

+0

Ich denke, es 'Nachricht geschrieben werden sollte = "{error.project.creation.size}"' 'error.project übereinstimmen. creation.size' –

+0

Ich habe das auch versucht. Hat nicht für mich funktioniert, also denke ich, es gibt ein anderes Problem. –

+0

Ok, und wenn Sie es versucht haben, was war der Inhalt des Error-Objekts? War die Nachricht vorhanden? –

Antwort

1

Endlich konnte ich die Quelle des Problems finden. Im Code für Benachrichtigungen Rendering, es gab einen spring:message tag:

<spring:message code="${error.code}" arguments="${error.arguments}"/> 

Wenn Werke auf folgende Weise: es sieht für letzten Code aus dem codes Array in Errors Klasse (siehe DefaultMessageSourceResolvable.getCode-Methode) und deshalb ist es couldn‘ t finden Size Nachricht und nicht abgeholt defaultMessage erstellt von Hibernate Validator oder die benutzerdefinierte.

Die einfache Lösung war in diesem Fall hinzufügen text Attribut:

<spring:message code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/> 
Verwandte Themen