MessageSource di convalida personalizzata in Spring Boot

1. Panoramica

MessageSource è una potente funzionalità disponibile nelle applicazioni Spring. Questo aiuta gli sviluppatori di applicazioni a gestire vari scenari complessi con la scrittura di molto codice extra, come configurazione specifica per l'ambiente, internazionalizzazione o valori configurabili.

Un altro scenario potrebbe essere la modifica dei messaggi di convalida predefiniti in messaggi più intuitivi / personalizzati.

In questo tutorial, vedremo come configurare e gestire MessageSource di convalida personalizzata nell'applicazione utilizzando Spring Boot .

2. Dipendenze di Maven

Cominciamo con l'aggiunta delle necessarie dipendenze Maven:

 org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-validation 

Puoi trovare le ultime versioni di queste librerie su Maven Central.

3. Esempio di messaggio di convalida personalizzato

Consideriamo uno scenario in cui dobbiamo sviluppare un'applicazione che supporti più lingue. Se l'utente non fornisce i dettagli corretti come input, vorremmo mostrare i messaggi di errore in base alle impostazioni locali dell'utente.

Facciamo un esempio di un bean del modulo di accesso:

public class LoginForm { @NotEmpty(message = "{email.notempty}") @Email private String email; @NotNull private String password; // standard getter and setters }

Qui abbiamo aggiunto vincoli di convalida che verificano se un'e-mail non viene fornita o fornita, ma non segue lo stile dell'indirizzo e-mail standard.

Per mostrare messaggi personalizzati e specifici delle impostazioni internazionali, possiamo fornire un segnaposto come indicato per l' annotazione @NotEmpty .

La proprietà email.notempty verrà risolta da un file delle proprietà dalla configurazione MessageSource .

4. Definizione del bean MessageSource

Un contesto dell'applicazione delega la risoluzione del messaggio a un bean con il nome esatto messageSource.

ReloadableResourceBundleMessageSource è il comune più MessageSource implementazione che risolve i messaggi provenienti da pacchetti di risorse per i diversi locali:

@Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename("classpath:messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; }

Qui, è importante fornire il nome di base poiché i nomi di file specifici della locale verranno risolti in base al nome fornito.

5. Definizione di LocalValidatorFactoryBean

Per utilizzare i messaggi con nome personalizzato in un file delle proprietà come è necessario definire un LocalValidatorFactoryBean e registrare il messageSource:

@Bean public LocalValidatorFactoryBean getValidator() { LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean(); bean.setValidationMessageSource(messageSource()); return bean; }

Tuttavia, nota che se avessimo già esteso il WebMvcConfigurerAdapter , per evitare di ignorare il validatore personalizzato, avremmo dovuto impostare il validatore sovrascrivendo il metodo getValidator () dalla classe genitore.

Ora possiamo definire un messaggio di proprietà come:

" Email.notempty ="

invece di

"Javax.validation.constraints.NotEmpty.message ="

6. Definizione dei file delle proprietà

Il passaggio finale consiste nel creare un file delle proprietà nella directory src / main / resources con il nome fornito nel nome di base nel passaggio 4:

# messages.properties email.notempty=Please provide valid email id.

Qui possiamo trarre vantaggio dall'internazionalizzazione insieme a questo. Supponiamo di voler mostrare i messaggi per un utente francese nella sua lingua.

In questo caso, dobbiamo aggiungere un altro file di proprietà con il nome messages_fr.properties nella stessa posizione (nessuna modifica al codice richiesta):

# messages_fr.properties email.notempty=Veuillez fournir un identifiant de messagerie valide.

7. Conclusione

In questo articolo, abbiamo spiegato come i messaggi di convalida predefiniti possono essere modificati senza modificare il codice se la configurazione viene eseguita correttamente in anticipo.

Possiamo anche sfruttare il supporto dell'internazionalizzazione insieme a questo per rendere l'applicazione più user-friendly.

Come sempre, il codice sorgente completo è disponibile su GitHub.