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=<Custom_Message>”
вместо
«javax.validation.constraints.NotEmpty.message=<Custom_message>»
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 .