2012-04-30 11 views
8

Lassen Sie mich zuerst erklären, dass ich Spring MVC 3.1.1 und Hibernate Validierung 4.2.0 verwende. Ich verwende Validierungsannotationen für verschiedene Formulare in meiner Spring-Anwendung. Da meine Anwendung lokalisiert werden muss, habe ich schon ein Ressourcenpaket für meine Prüfungsmeldungen verwenden, die ein wenig wie folgt aussieht:Wie kann ich Spring zeigen verschiedene Validierung Bundle-basierte Nachrichten für den gleichen Prüfer in einer Klasse?

# ValidationMessages.bundle 
FieldMatch=Password and confirmation must match. 

Die entsprechende Klassendefinition für diese Meldung wie folgt aussieht:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Ich habe dieses benutzerdefinierte Ressourcenpaket in meiner appContext.xml eingerichtet, und meine Nachrichten werden ohne Probleme im Formular angezeigt.

Hier ist mein Dilemma jedoch. Es gibt eine neue Anforderung, dass ich bestätigen muss, dass mehr Felder übereinstimmen. Im Moment bestätige ich nur, dass zwei Passwortfelder übereinstimmen. Jetzt ist meine Anforderung, dass ich E-Mail-Adresse auch bestätigen muss. Ich weiß, das ist eine dumme Forderung, aber ich kann es nicht ändern. So, jetzt die Klassendefinition wird wie folgt aussehen:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
    @FieldMatch(first = "email", second = "emailConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

ist klar, mein aktuelles Ressourcenpaket wird nicht funktionieren, weil ich brauche zwei separate Nachrichten (eine für jedes Spiel). Ich habe versucht, message="{emails.must.match}" zu verwenden und dann diese Nachricht in dem Ressourcenbündel zu definieren, aber es zeigt die Nachricht nie tatsächlich an, es zeigt nur den tatsächlichen Text {email.must.match}.

Also nach all dem Erklären ist meine Frage einfach: Wie kann ich jedem dieser FieldMatch Validatoren auf der Klassenebene eine andere Nachricht geben, die in einem Ressourcenbündel definiert ist, damit es lokalisiert werden kann?

Vielen Dank im Voraus für jede Hilfe!

[EDIT] Für die Neugierigen, this ist der FieldMatch Validator, den ich benutze.

UPDATE 2012.05.23 Hier ist die Bohne Definition andere haben gefragt:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>ErrorBundle</value> 
      <value>ForgotPasswordBundle</value> 
      <!-- etc etc --> 
     </list> 
    </property> 
</bean> 

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

Antwort

1

Fälle wie diese schalten normalerweise etwas ein, das das OP in der Frage nicht einschließt. Ich schätze, das liegt daran, dass wenn die Lösung einfach wäre oder durch etwas verursacht wurde, von dem die OP dachte, dass es von ihr verursacht wurde, hätten sie kein Problem. Kein Urteil; Ich habe es getan.

So stelle ich Fehlerbehebungsschritte statt einer vollständigen Lösung vor, denn basierend auf dem, was Sie gesagt haben, sollte es funktionieren.

Zuerst überprüfen wir, dass es kein merkwürdiges Interpolationsproblem ist, und versuchen Sie message="{emails-must-match}".

Wenn das nicht funktioniert, scheint es, dass Sie ValidationMessages.properties verwendet haben. Ich würde zurückgehen (<property name="validationMessageSource" ref="messageSource"/> aus der Validator-Konfiguration entfernen) und sehen, ob Sie message="{emails.must.match}" mit emails.must.match arbeiten können, die in ValidationMessages.properties definiert sind. Wenn das immer noch nicht funktioniert, gehen Sie zurück zu der Standardmeldung, die Sie mit dem Schlüssel FieldMatch hatten, und sehen Sie, ob Sie diese Nachricht für beide Fehlerbedingungen erhalten.

Das wird helfen, das Problem zu lokalisieren.

+0

Dies setzte mich auf den richtigen Weg. Mein Bundle hatte eigentlich nicht den Namen "ValidationMessages.properties", sondern "ValidationBundle.properties". Als ich die Datei umbenannte, funktionierte alles und ich bekam die richtige Zeichenfolge. Prost! –

0

Was ist in Ihrem Ressourcenbündel der Schlüssel der Nachricht ist? Es sollte "email.must.match" lauten (dh ohne die geschweiften Klammern, die für das Attribut message der Einschränkung erforderlich sind).

+0

Ich habe sichergestellt, dass die Namen genau übereinstimmen, ohne Glück. Es zeigt nur die geschweifte Klammer Version. –

+1

Können Sie angeben, wie Sie Ihren Validator einrichten (Anwendungskontext)? Verwenden Sie 'LocalValidatorFactoryBean'? Wo befindet sich auch Ihr Nachrichtenpaket? Hat es den Namen ValidationMessages.properties? – Gunnar

1

FieldMatch verwendet einen JSR-303-Validator (javax.validation.Validator), keinen Spring-Validator (org.springframework.validation.Validator). Haben Sie die Nachrichtenquelle Config wie:

<!-- JSR-303 --> 
<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

und natürlich messageSource die entsprechenden?

+0

siehe Updates oben :) –