1.概述
MessageSource是Spring应用程序中可用的强大功能。这有助于应用程序开发人员编写大量额外的代码来处理各种复杂的情况,例如特定于环境的配置,国际化或可配置的值。
另一种情况是将默认验证消息修改为更用户友好/自定义消息。
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](https://search.maven.org/classic/#search|ga|1|(g%3A"org.springframework.boot" AND (a%3A"spring-boot-starter-validation" OR a%3A"spring-boot-starter-web"))上找到这些库的最新版本 。
3.自定义验证消息示例
让我们考虑一个场景,其中我们必须开发一个支持多种语言的应用程序。如果用户未提供正确的详细信息作为输入,我们将根据用户的语言环境显示错误消息。
让我们以Login表单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.定义MessageSourceBean
应用程序上下文将消息解析委托给确切名称为messageSource的bean 。
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 = <自定义消息>”
6.定义属性文件
最后一步是在src / main / resources目录中创建属性文件,并使用步骤4中basename中提供的名称:
# messages.properties
email.notempty=Please provide valid email id.
在这里,我们可以同时利用国际化的优势。假设我们要以法语显示给法语用户的消息。
在这种情况下,我们必须在同一位置添加一个名称为messages_fr.properties的属性文件 (根本不需要更改代码):
# messages_fr.properties
email.notempty=Veuillez fournir un identifiant de messagerie valide.