«1. Обзор

MessageSource — это мощная функция, доступная в приложениях Spring. Это помогает разработчикам приложений обрабатывать различные сложные сценарии с написанием большого количества дополнительного кода, такого как конфигурация для конкретной среды, интернационализация или настраиваемые значения.

Еще одним сценарием может быть изменение сообщений проверки по умолчанию на более удобные/настраиваемые сообщения.

В этом руководстве мы увидим, как настраивать и управлять настраиваемой проверкой MessageSource в приложении с помощью Spring Boot.

2. Зависимости Maven

Начнем с добавления необходимых зависимостей Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Последние версии этих библиотек можно найти на Maven Central.

3. Пример пользовательского сообщения проверки

Давайте рассмотрим сценарий, в котором нам нужно разработать приложение, поддерживающее несколько языков. Если пользователь не предоставляет правильные данные в качестве входных данных, мы хотели бы отображать сообщения об ошибках в соответствии с региональными настройками пользователя.

Давайте рассмотрим пример bean-компонента формы входа:

public class LoginForm {

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

    @NotNull
    private String password;

    // standard getter and setters
}

Здесь мы добавили ограничения проверки, которые проверяют, не предоставлено ли электронное письмо вообще или предоставлено, но не соответствует стандартному стилю адреса электронной почты.

Чтобы отобразить пользовательское и зависящее от локали сообщение, мы можем предоставить заполнитель, как указано для аннотации @NotEmpty.

Свойство email.notempty будет разрешено из файлов свойств с помощью конфигурации MessageSource.

4. Определение компонента MessageSource

Контекст приложения делегирует разрешение сообщения компоненту с точным именем messageSource.

ReloadableResourceBundleMessageSource — это наиболее распространенная реализация MessageSource, которая разрешает сообщения из пакетов ресурсов для разных локалей:

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

Здесь важно указать базовое имя, поскольку имена файлов, зависящие от локали, будут разрешаться на основе предоставленного имени.

5. Определение LocalValidatorFactoryBean

Чтобы использовать сообщения с пользовательскими именами в файле свойств, например, нам нужно определить LocalValidatorFactoryBean и зарегистрировать messageSource:

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

Однако обратите внимание, что если мы уже расширили WebMvcConfigurerAdapter до чтобы избежать игнорирования пользовательского валидатора, нам пришлось бы установить валидатор, переопределив метод getValidator() из родительского класса.

Теперь мы можем определить сообщение свойства, например:

«email.notempty=\u003cCustom_Message\u003e»

вместо

«javax.validation.constraints.NotEmpty.message=\u003cCustom_message\u003e» €

6. Определение файлов свойств

Последним шагом является создание файла свойств в каталоге src/main/resources с именем, указанным в базовом имени на шаге 4:

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

Здесь мы можем взять преимущество интернационализации наряду с этим. Допустим, мы хотим показывать сообщения для французского пользователя на его языке.

В этом случае мы должны добавить еще один файл свойств с именем messages_fr.properties в том же месте (никаких изменений в коде не требуется):

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

7. Заключение

В этой статье , мы рассмотрели, как сообщения проверки по умолчанию можно изменить без изменения кода, если конфигурация выполнена правильно заранее.

Наряду с этим мы можем использовать поддержку интернационализации, чтобы сделать приложение более удобным для пользователя.

Как всегда, полный исходный код доступен на GitHub.