对于国际性应用来说,提示信息的双语化是必须的,那么@Validated 和 @Valid校验提示信息怎么来进行双语化呢,下面我们一起学习一下。
@Validated 和 @Valid校验提示信息的双语化
SpringBoot项目双语化配置
因为这里是基于SpringBoot项目学习的,所以我们首先需要配置一下SpringBoot项目的双语化,具体步骤如下:
设置配置文件
# 设置国际化消息是否总是采用格式化,默认是false
spring.messages.always-use-message-format=true
# 设置国际化属性名称,如果多个可以使用逗号分隔,默认是messages
spring.messages.basename=param-valid-messages
# 设置国际化消息缓存超时秒数,默认永远不过期,如果是0表示每次都需要重新加载
spring.messages.cache-duration=0
# 国际化消息编码
spring.messages.encoding=UTF-8
# 如果没有找到特定区域设置的文件,则设置是否返回系统区域设置
spring.messages.fallback-to-system-locale=true
# 是否使用消息编码作为默认的响应消息,而非抛出NoSuchMessageException异常,只建议再开发阶段使用
spring.messages.use-code-as-default-message=false
创建国际化消息资源文件
添加国际化消息配置类
@Configuration
public class MessageConfig implements WebMvcConfigurer {
/**
* 国际化拦截器
*/
private LocaleChangeInterceptor localeChangeInterceptor;
/**
* 初始化国际化解析器
* 注意:这里的bean的名称必须是“localeResolver”,这是和SpringMVC的约定
* @return 基于session的国际化解析器
*/
@Bean(name = "localeResolver")
public LocaleResolver initLocaleResolver(){
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
// 设置默认的国际化区域是中国(简体中文)
sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return sessionLocaleResolver;
}
/**
* 创建国际化拦截器
* @return 国际化拦截器
*/
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
if(localeChangeInterceptor != null){
return localeChangeInterceptor;
}
localeChangeInterceptor = new LocaleChangeInterceptor();
// 设置参数名,这样就可以根据请求的"param-valid-language"参数值来判断当前的语言环境
localeChangeInterceptor.setParamName("param-valid-language");
return localeChangeInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
封装消息获取工具类
@Component
public class MessageHandler {
@Autowired
private MessageSource messageSource;
public String getMessage(String messageKey){
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(messageKey, null, locale);
}
public String getMessage(String messageKey, Object...params){
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(messageKey, params, locale);
}
}
测试
经过上述步骤,就设置好了国际化消息的基本配置,下面创建一些国际化消息以及测试接口来测试一下:
@Autowired
private MessageHandler messageHandler;
@GetMapping("/messageTest")
public ResultVO messageTest(){
return new ResultVO()
.setCode(ResultVO.VALID_PASS)
.setMsg(messageHandler.getMessage("message.test"))
;
}
测试结果如下:
@Validated 和 @Valid校验提示信息的双语化
有了上面的基础,我们再来一起设置下@Validated 和 @Valid校验提示信息的双语化
给mvc的validator设置双语化
@Configuration
public class MessageConfig implements WebMvcConfigurer {
@Autowired
private MessageSource messageSource;
/**
* valid校验机制提示信息国际化设置
*/
@Bean
public LocalValidatorFactoryBean validatorFactoryBean(){
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource);
return localValidatorFactoryBean;
}
@Override
public Validator getValidator() {
return validatorFactoryBean();
}
}
条件校验注解的message使用占位符
@Data
public class UserDTO {
@NotNull(message = "{notNull}")
private Object notNull;
@Length(min = 1, max = 10, message = "{length}")
private String length;
@Min(value = 1, message = "{min}")
private Integer min;
}
准备双语文件
测试
好了,今天就先到这里了,拜拜。