2009-12-10 9 views
19

Ich versuche, validators unter dem Spring MVC-Framework zu schreiben, aber es gibt eine eklatante Unterlassung in der Dokumentation. Beim Aufruf eines Fehlers an das Objekt Errors erwarten die meisten Methoden einen String-Parameter namens errorCode. Diese errorCodes, wenn ich das richtig verstehe, dienen als Ersatz für spezifische Fehlermeldungen. Aber ich kann nicht fürs Leben herausfinden, wo diese Codes abgebildet sind.Wo werden die Spring MVC Validierungsfehlercodes aufgelöst?

Hier ist ein Beispiel von dem, was ich von Spring MVC Javadoc beziehen;

public class UserLoginValidator implements Validator { 

    private static final int MINIMUM_PASSWORD_LENGTH = 6; 

    public boolean supports(Class clazz) { 
     return UserLogin.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); 
     UserLogin login = (UserLogin) target; 
     if (login.getPassword() != null 
      && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { 
      errors.rejectValue("password", "field.min.length", 
       new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, 
       "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length."); 
     } 
    } 
} 

Kann mir jemand aufklären?

Antwort

15

Ich verwende den Standard Message Resolver.

In meinem dispatcher-servlet.xml, ich habe

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

und dann in der obersten Ebene meines classes ich eine Textdatei "messages.properties", die enthält Zuordnungen wie folgt aufgerufen haben:

error.firstname.null=Please enter your first name. 
error.lastname.null=Please enter your last name. 

Wenn Sie einen benutzerdefinierten MessageCodesResolver verwenden möchten, können Sie die MessageCodeResolver-Schnittstelle implementieren und dann Ihren Resolver für einen bestimmten Controller wie folgt definieren:

<bean id="myController"> 
    <property name="messageCodesResolver" ref="myMessageCodesResolver" /> 
</bean> 

Es gibt derzeit keine Möglichkeit, eine benutzerdefinierte MessageCodeResolver global zu definieren; Es gibt eine enhancement request for that here. Ein Ansatz, bei dem die Bean-Vererbung verwendet wird, um alle Controller-Beans von einer Controller-Bean-Definition zu erben, ist here.

+0

Danke für die Information, das gibt mir genug, um meinen Validator zu nutzen. Aber im Interesse des Lernens, was würde ich tun, wenn ich in einem benutzerdefinierten MessageCodeResolver neu verkabeln wollte, wohin würde ich gehen? Auch nur für Wohlstand ResourceBundleMessageSource ist Javadoc unter http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html. –

+1

Wenn Sie einen benutzerdefinierten MessageCodeResolver verwenden möchten, können Sie einen für einen bestimmten Controller zuweisen. Ein Ansatz besteht also darin, die Bean-Vererbung zu verwenden, um alle Controller-Beans von einer Controller-Bean-Definition zu erben, wie hier beschrieben: http://forum.springsource.org/showthread.php?t=46336 Es gibt derzeit keinen Weg um einen benutzerdefinierten MessageCodeResolver global zu definieren; Hier gibt es eine Verbesserungsanforderung: https://jira.springsource.org/browse/SPR-5187 –

+1

Als Referenz wurde die globale benutzerdefinierte Funktion "MessageCodeResolver" schließlich in Spring 3.1 (2011) implementiert. Siehe auch [SPR-6506] (https://jira.spring.io/browse/SPR-6506). – vallismortis

3

Sie werden von Ihrem MessageSource und einem MessagesCodeResolver gelöst.

Here ist der entsprechende Abschnitt im Referenzhandbuch:

Ausgabe Meldungen zu Validierungsfehler entspricht, ist das letzte, was wir besprechen müssen. In dem oben gezeigten Beispiel haben wir den Namen und das Altersfeld abgelehnt. Wenn wir die Fehlermeldungen mit einer MessageSource ausgeben, verwenden wir den Fehlercode, den wir bei der Ablehnung des Feldes angegeben haben (in diesem Fall 'name' und 'age'). Wenn Sie (entweder direkt oder indirekt, z. B. mit der Klasse ValidationUtils) rejectValue oder eine der anderen Zurückweisungsmethoden von der Schnittstelle Errors aufrufen, registriert die zugrunde liegende Implementierung nicht nur den von Ihnen übergebenen Code, sondern auch eine Anzahl von zusätzliche Fehlercodes

+0

Wo legen Sie fest, was MessageCodeResolver zu benutzen? –

+0

Eine Standardinstanz (DefaultMessageCodesResolver) wird verwendet, wenn Sie keine angeben. Sie sollten nur eine MessageSource registrieren, die automatisch verwendet wird. –

+0

Wie registrieren Sie eine MessageSource? Ich sehe MessageCodesResolver als Bean-Eigenschaft. Aber gibt es eine Möglichkeit, einen MessageCodeResolver für die gesamte Anwendung als universell zu definieren? –

1

Aus irgendeinem Grund, wenn Sie die Nachrichten im Controller ähnlich wie Form lösen wollen: Fehler jsp-Tags können Sie wie folgt vorgehen:

//result is BindingResult 
    List<String> errors = new ArrayList<String>(); 
    List<ObjectError> allErrors = result.getAllErrors(); 
    for (ObjectError error : allErrors) { 
     String message = messageSource.getMessage(error, null); 
     errors.add(message); 
    } 
+0

Ich möchte darauf hinweisen, dass MessageSource im Controller @Autowired sein kann – leojh