2012-04-30 10 views
8

Prima di tutto, vorrei spiegare che sto usando Spring MVC 3.1.1 e Hibernate validation 4.2.0. Uso le annotazioni di convalida per vari moduli nella mia applicazione Spring. Dal momento che la mia applicazione deve essere localizzato, sono stato utilizzando un pacchetto di risorse per i miei messaggi di convalida che assomiglia un po 'come questo:Come posso far visualizzare a Spring i diversi messaggi basati su bundle di convalida per lo stesso validatore su una classe?

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

La definizione della classe corrispondente per questo messaggio appare così:

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

Ho impostato questo pacchetto di risorse personalizzate nel mio appContext.xml e i miei messaggi vengono visualizzati sul modulo senza alcun problema.

Ecco il mio dilemma, tuttavia. C'è un nuovo requisito che devo confermare più campi corrispondono. In questo momento sto solo confermando che due campi password corrispondono. Ora il mio requisito è che devo confermare anche l'indirizzo email. So che questo è uno stupido requisito, ma non posso cambiarlo. Così ora la definizione di classe sarà simile a questa:

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

Chiaramente, il mio attuale pacchetto di risorse non funziona perché ho bisogno di due messaggi separati (uno per ogni partita). Ho provato a utilizzare message="{emails.must.match}" e quindi a definire quel messaggio nel pacchetto di risorse, ma in realtà non mostra mai il messaggio, mostra solo il testo attuale {email.must.match}.

Quindi, dopo tutto quello che spiega, la mia domanda è semplice: come posso fare in modo che ognuno di quei validatori FieldMatch a livello di classe abbia un messaggio diverso che è definito in un pacchetto di risorse in modo che possa essere localizzato?

Grazie in anticipo per qualsiasi aiuto!

[EDIT] Per chi è curioso, this è il validatore FieldMatch che sto utilizzando.

UPDATE 2012/05/23 Ecco gli altri definizione di fagioli hanno chiesto:

<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> 

risposta

1

Casi come questo di solito attivano qualcosa che l'OP non ha incluso nella domanda. Immagino che questo sia perché se la soluzione fosse semplice o causata da qualcosa che l'OP pensava fosse causata da, non avrebbero alcun problema. Nessun giudizio; L'ho fatto.

Quindi presento i passaggi per la risoluzione dei problemi anziché una soluzione completa, perché in base a ciò che hai detto, dovrebbe funzionare.

Per prima cosa, ricontrolliamo che non si tratta di un problema di interpolazione strano e prova message="{emails-must-match}".

Se ciò non funziona, beh, sembra che avessi ValidationMessages.properties funzionante. Tornerò su questo (rimuovendo <property name="validationMessageSource" ref="messageSource"/> dalla configurazione del validatore) e vediamo se è possibile ottenere message="{emails.must.match}" per lavorare con emails.must.match definito in ValidationMessages.properties. Se il problema persiste, tornare al messaggio predefinito che si utilizzava con il codice FieldMatch e vedere se si ottiene quel messaggio per entrambe le condizioni di errore.

Ciò contribuirà a localizzare il problema.

+0

Questo mi ha messo sulla strada giusta. Il mio bundle in realtà non era denominato 'ValidationMessages.properties', ma invece' ValidationBundle.properties' - quando ho rinominato il file, tutto ha funzionato e ho ottenuto la stringa corretta. Saluti! –

0

Qual è la chiave del messaggio nella tua resource bundle? Dovrebbe essere "emails.must.match" (ovvero, senza le parentesi graffe necessarie per l'attributo message del vincolo).

+0

Ho assicurato che i nomi corrispondessero esattamente senza fortuna. Mostra solo la versione di parentesi graffa. –

+1

Puoi pubblicare la configurazione del validatore (contesto dell'applicazione)? Stai usando 'LocalValidatorFactoryBean'? Inoltre, dove si trova il pacchetto di messaggi? Si chiama ValidationMessages.properties? – Gunnar

1

FieldMatch utilizza un validatore JSR-303 (javax.validation.Validator), non un validatore Spring (org.springframework.validation.Validator). Hai config la fonte messaggio del tipo:

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

e, naturalmente, il corrispondente messageSource?

+0

vedi aggiornamenti sopra :) –