Benutzerdefinierte Validierungs-MessageSource in Spring Boot

Benutzerdefinierte Validierung MessageSource in Spring Boot

1. Überblick

MessageSource ist eine leistungsstarke Funktion, die in Spring-Anwendungen verfügbar ist. Dies hilft Anwendungsentwicklern beim Umgang mit verschiedenen komplexen Szenarien, indem sie viel zusätzlichen Code schreiben, z. B. umgebungsspezifische Konfiguration, Internationalisierung oder konfigurierbare Werte.

Ein weiteres Szenario könnte darin bestehen, die Standardvalidierungsnachrichten in benutzerfreundlichere / benutzerdefinierte Nachrichten zu ändern.

In diesem Tutorial werdenwe’ll see how to configure and manage custom validation MessageSource in the application using Spring Boot.

2. Maven-Abhängigkeiten

Beginnen wir mit dem Hinzufügen der erforderlichen Maven-Abhängigkeiten:


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


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

Sie finden die neuesten Versionen dieser Bibliotheken überMaven Central.

3. Beispiel für eine benutzerdefinierte Validierungsnachricht

Betrachten wir ein Szenario, in dem wir eine Anwendung entwickeln müssen, die mehrere Sprachen unterstützt. Wenn der Benutzer nicht die richtigen Details als Eingabe angibt, möchten wir Fehlermeldungen entsprechend dem Gebietsschema des Benutzers anzeigen.

Nehmen wir ein Beispiel für eine Login-Formular-Bean:

public class LoginForm {

    @NotEmpty(message = "{email.notempty}")
    @Email
    private String email;

    @NotNull
    private String password;

    // standard getter and setters
}

Hier haben wir Validierungsbeschränkungen hinzugefügt, die überprüfen, ob eine E-Mail überhaupt nicht oder nicht bereitgestellt wird, aber nicht dem Standardstil der E-Mail-Adresse entspricht.

Um benutzerdefinierte und länderspezifische Nachrichten anzuzeigen, können wir einen Platzhalter bereitstellen, wie für die Annotation@NotEmptyangegeben.

Dieemail.notempty -Eigenschaft wird durch die Konfiguration vonMessageSourceaus einer Eigenschaftendatei aufgelöst.

4. Defining the MessageSource  * Bean *

Ein Anwendungskontext delegiert die Nachrichtenauflösung an eine Bean mit dem genauen NamenmessageSource.

ReloadableResourceBundleMessageSource ist die häufigste Implementierung vonMessageSource, mit der Nachrichten aus Ressourcenpaketen für verschiedene Ländereinstellungen aufgelöst werden:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource
      = new ReloadableResourceBundleMessageSource();

    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

Hier ist es wichtig,basename anzugeben, da länderspezifische Dateinamen basierend auf dem angegebenen Namen aufgelöst werden.

5. Definieren LocalValidatorFactoryBean

Um benutzerdefinierte Namensnachrichten in einer Eigenschaftendatei wie der zu verwenden, müssen wirLocalValidatorFactoryBean definieren undmessageSource: registrieren

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

Beachten Sie jedoch, dass wir, wenn wir dieWebMvcConfigurerAdapter bereits erweitert haben, um zu vermeiden, dass der benutzerdefinierte Validator ignoriert wird, den Validator festlegen müssen, indem wir diegetValidator()-Methode aus der übergeordneten Klasse überschreiben.

Jetzt können wir eine Eigenschaftsnachricht wie folgt definieren:

email.notempty=<Custom_Message>”

Anstatt von

“Javax.validation.constraints.NotEmpty.message =

6. Definieren von Eigenschaftendateien

Der letzte Schritt besteht darin, eine Eigenschaftendatei im Verzeichnissrc/main/resources mit dem Namen zu erstellen, der inbasename in Schritt 4 angegeben ist:

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

Hier können wir auch die Internationalisierung nutzen. Angenommen, wir möchten Nachrichten für einen französischen Benutzer in seiner Sprache anzeigen.

In diesem Fall müssen wir eine weitere Eigenschaftendatei mit dem Namenmessages_fr.properties am selben Speicherort hinzufügen (überhaupt keine Codeänderungen erforderlich):

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

7. Fazit

In diesem Artikel wurde erläutert, wie die Standardüberprüfungsmeldungen geändert werden können, ohne den Code zu ändern, wenn die Konfiguration zuvor ordnungsgemäß durchgeführt wurde.

Gleichzeitig können wir die Unterstützung der Internationalisierung nutzen, um die Anwendung benutzerfreundlicher zu gestalten.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.